Estou usando restrições de layout automático programaticamente para fazer o layout de minhas células UITableView personalizadas e estou definindo corretamente os tamanhos das células em tableView:heightForRowAtIndexPath:
Ele está trabalhando muito bem no iOS6 e ele faz olhar bem em iOS7 bem
MAS quando executo o aplicativo no iOS7, eis o tipo de mensagem que vejo no console:
Break on objc_exception_throw to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
2013-10-02 09:56:44.847 Vente-Exclusive[76306:a0b] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0xac4c5f0 V:|-(15)-[UIImageView:0xac47f50] (Names: '|':UITableViewCellContentView:0xd93e850 )>",
"<NSLayoutConstraint:0xac43620 V:[UIImageView:0xac47f50(62)]>",
"<NSLayoutConstraint:0xac43650 V:[UIImageView:0xac47f50]-(>=0)-[UIView:0xac4d0f0]>",
"<NSLayoutConstraint:0xac43680 V:[UIView:0xac4d0f0(1)]>",
"<NSLayoutConstraint:0xac436b0 V:[UIView:0xac4d0f0]-(0)-| (Names: '|':UITableViewCellContentView:0xd93e850 )>",
"<NSAutoresizingMaskLayoutConstraint:0xac6b120 h=--& v=--& V:[UITableViewCellContentView:0xd93e850(44)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xac43650 V:[UIImageView:0xac47f50]-(>=0)-[UIView:0xac4d0f0]>
E, de fato, há uma das restrições nessa lista que não quero:
"<NSAutoresizingMaskLayoutConstraint:0xac6b120 h=--& v=--& V:[UITableViewCellContentView:0xd93e850(44)]>"
e não consigo definir a translatesAutoresizingMaskIntoConstraints
propriedade de contentView
como NÃO =>, isso bagunçaria toda a célula.
44 é a altura de célula padrão, mas eu defini minhas alturas customizadas no delegado de visualização de tabela, então por que a célula contentView tem essa restrição? O que pode causar isso?
No iOS6 isso não está acontecendo e tudo parece bem no iOS6 e no iOS7.
Meu código é muito grande, então não vou postá-lo aqui, mas fique à vontade para pedir um pastebin se precisar.
Para especificar como estou fazendo isso, na inicialização da célula:
- Eu crio todos os meus rótulos, botões, etc.
- Eu defini sua
translatesAutoresizingMaskIntoConstraints
propriedade como NÃO - Eu os adiciono como subvisões da
contentView
célula - Eu adiciono as restrições no
contentView
Também estou profundamente interessado em entender por que isso acontece apenas no iOS7.
Respostas:
Eu tive esse problema também .. Parece que o frame do contentView não é atualizado até que
layoutSubviews
seja chamado, no entanto, o frame da célula é atualizado antes, deixando o frame do contentView definido como{0, 0, 320, 44}
no momento em que as restrições são avaliadas.Depois de examinar o contentView com mais detalhes, parece que o autoresizingMasks não estão mais sendo definidos.
Definir o autoresizingMask antes de restringir suas visualizações pode resolver este problema:
fonte
self.contentView.bounds = CGRectMake(0, 0, 99999, 99999);
antes de adicionar suas restrições, o que deve resolver o problema.self.contentView.bounds = CGRectMake(0, 0, 99999, 99999);
funciona tão bem quanto usarself.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
. Eu coloquei issoupdateConstraints
antes de adicionar as restrições à minha visualização de conteúdo.Aparentemente, há algo errado com UITableViewCell e UICollectionViewCell no iOS 7 usando iOS 8 SDK.
Você pode atualizar o contentView da célula quando a célula é reutilizada desta forma:
Para UITableViewController estático:
Como os controladores de visualização de tabela estática são frágeis e podem ser facilmente quebrados se você implementar alguma fonte de dados ou métodos deletegate - há verificações que garantirão que este código só será compilado e executado no iOS 7
É semelhante para UITableViewController dinâmico padrão:
Para este caso, não precisamos da verificação extra de compilação, já que a implementação deste método é necessária.
A ideia é a mesma para ambos os casos e para UICollectionViewCell, como comentado neste tópico: O problema de dimensionamento automático do quadro de UICollectionViewCell contentView na célula de protótipo do Storyboard (Xcode 6, iOS 8 SDK) ocorre quando executado no iOS 7 apenas
fonte
Como as células estão sendo reutilizadas e a altura pode mudar com base no conteúdo, acho que, em geral, seria melhor definir a prioridade dos espaçamentos para menos do que o necessário.
No seu caso, o UIImageView tem um espaçamento de 15 na parte superior e a vista inferior tem um espaçamento de 0 na parte inferior. Se você definir a prioridade dessas restrições para 999 (em vez de 1000), o aplicativo não travará, porque as restrições não são necessárias.
Assim que o método layoutSubviews for chamado, a célula terá a altura correta e as restrições podem ser satisfeitas normalmente.
fonte
Ainda não encontrei uma boa solução para storyboards ... Algumas informações também aqui: https://github.com/Alex311/TableCellWithAutoLayout/commit/bde387b27e33605eeac3465475d2f2ff9775f163#commitcomment-4633188
Pelo que eles aconselham lá:
Eu induzi minha solução:
.
.
fonte
Basta aumentar a altura padrão da célula. Parece que o problema é que o conteúdo da célula é maior do que o tamanho de célula padrão (inicial), violando algumas restrições de não negatividade até que a célula seja redimensionada para seu tamanho real.
fonte
UITableViewCellScrollView
) entre a célula de visualização de tabela e a visualização de conteúdo; isso provavelmente explica a diferença entre iOS 6 e 7 aqui.Talvez defina a prioridade da visualização maior que 750 e menos de 1000 pode resolver.
fonte
Eu tive o mesmo problema. Minha solução baseada em outras acima:
Atenciosamente Alessandro
fonte
You should not call this method directly. If you want to force a layout update, call the setNeedsLayout method instead to do so prior to the next drawing update. If you want to update the layout of your views immediately, call the layoutIfNeeded method.
Também enfrentei esse problema e nenhuma das sugestões ajudou. No meu caso, eu tinha uma célula de seleção de tamanho, e ela continha collectionView dentro (cada célula collectionView continha uma imagem em tamanho real). Agora, a altura do tamanho da célula era um pouco maior (60) do que a collectionView (50) e as imagens dentro dela (50). Por causa disso, a visão collectionView tem a restrição de alinhamento inferior à supervisualização com um valor de 10. Nesse caso, um aviso, e a única maneira de corrigir isso era tornar a altura da célula igual à de sua collectionView.
fonte
Acabei não usando UITableViewCell no designer ... Eu crio lá uma visualização personalizada e adiciono-a à visualização de conteúdo da célula programaticamente ... Com algumas categorias de ajuda também não há código clichê ...
fonte
Se funcionar bem no iOS8 e receber o aviso no iOS7, você pode pesquisar o código-fonte do storyboard, encontrar o tableviewCell correto e anexar o atributo rect após a linha tableviewCell. Graças a kuchumovn .
fonte