Alguém tem alguma ideia de como depurar isso?
Aviso apenas uma vez: detectado um caso em que as restrições sugerem ambiguamente uma altura de zero para a visualização do conteúdo de uma célula do tableview. Estamos considerando o colapso não intencional e usando a altura padrão.
As linhas têm uma altura fixa definida por
- (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 34.0;
}
E todos constraints
parecem estar felizes ...
O que também pode ser feito é adicionar restrições verticais da parte superior e inferior da visualização do conteúdo. Isso deixará o autolayout feliz (porque agora ele sabe como calcular a altura da célula sozinho).
fonte
Se você estiver usando restrições autoLayout e UITableViewAutomaticDimension, este erro não é um problema errôneo a ser descartado substituindo sua altura no código. Isso significa que determinar a altura da célula automaticamente não está funcionando porque você não tem as restrições verticais necessárias.
Se você é como eu e estava recebendo este erro e precisava de ajuda para identificar qual célula estava gerando o erro, você pode adicionar a seguinte linha logo antes do retorno de seu método 'heightforRowAtIndexPath'.
Isso imprimirá uma longa lista de seções e linhas, mas o erro aparecerá imediatamente após a célula específica que está causando o erro, e você pode identificar rapidamente qual célula está causando o problema e corrigir suas restrições de acordo. Isso é particularmente útil para células estáticas. Substituir a altura por um número inserido manualmente funcionará se você não estiver usando autoLayout e alturas de células automáticas, mas irá essencialmente desativar esses recursos, o que é uma solução muito pobre se for algo que você está tentando utilizar.
Se você não estava usando o método 'heightForRowAtIndexPath' anteriormente, mas deseja depurar esse erro sem desfazer a configuração UITableViewAutomaticDimension, basta adicionar ao seu código:
fonte
Parece haver um bug no XCode 6.1 que causa esse problema se usar o layout automático e você não especificar um valor para a Altura da Linha para cada Célula de Visualização de Tabela, mas em vez disso, você deixa o valor "padrão". Basta marcar a caixa de seleção "Personalizar" ao lado da Altura da linha, para cada célula, para que o aviso desapareça.
fonte
Sim, você obtém todas as restrições "felizes", mesmo no caso de ter apenas restrições horizontais para itens na célula de exibição de tabela. Eu tive o mesmo problema. Você também precisa adicionar restrições verticais. Fazendo isso, esse aviso irá embora.
fonte
As restrições podem ser satisfeitas com o propósito de layout, mas não satisfeitas com o propósito de altura automática da linha. Um layout feliz significa que o conteúdo pode ser definido sem ambigüidade. Isso satisfaria as verificações no Interface Builder.
Um layout feliz para altura automática da linha significa que, além do acima, você também está incluindo restrições na parte inferior da célula.
Mais aqui: detectado um caso em que as restrições sugerem ambiguamente uma altura de zero
fonte
Usei Row Height 43 (ou <> 44) no inspetor de tamanho de Table View e o erro desapareceu. Usando 44, recebo o erro. Xcode versão 6.0.1.
- Esta resposta foi removida por um moderador, por favor, não, isso corrige o problema. Isso RESOLVE o problema para mim e pode resolver para outras pessoas também. Então, você poderia fazer a gentileza de não excluí-lo novamente.
fonte
Não consegui remover o aviso, mas para fazer as restrições funcionarem, configurei a propriedade tableview, new to iOS8,
estimatedRowHeight
para a altura fixa e removi aheightForRowAtIndexPath
implementação.fonte
Se você está recebendo esse aviso, provavelmente é porque está usando layout automático e suas células não têm nenhuma restrição dentro delas.
Você deve parar de usar o layout automático ou implementar restrições que definam sem ambigüidade a altura das células.
Você pode desligar o layout automático no construtor de interface desmarcando a opção "Usar layout automático" no inspetor de arquivos à direita.
Se você optar por usar o layout automático e a altura das células for fixa, a implementação das restrições apropriadas deve ser fácil. Basta adicionar restrições de altura para subvisualizações da visão de conteúdo da célula e implementar restrições de espaço vertical entre as subvisualizações e entre as subvisualizações e a visão de conteúdo. Por exemplo, se sua célula tiver um rótulo, isso funcionaria:
Restrições verticais
Restrições horizontais
fonte
Você pode usar o AutoLayout para calcular a altura certa para você. Aqui está uma boa postagem sobre Dynamic Cell Height no iOS 8: http://natashatherobot.com/ios-8-self-sizing-table-view-cells-with-dynamic-type/
fonte
No Swift, forçar uma altura de retorno corrigiu meu problema:
fonte
Para uma solução padrão complicada, sem restrições, sem estimar alturas ou excesso de engenharia do problema. Eu criei um projeto padrão, conectei o tableview, mas esqueci de colocar o delegado de altura no controlador de visualização . Para simplesmente fazer este aviso desaparecer, você precisa disso.
No controlador de visualização da sua tabela.
fonte
Eu estava usando um mapView dentro de uitableviewcell. Mudei a altura da visualização do mapa para 1/3 do tamanho da tela do dispositivo. Eu tenho o mesmo erro. Corrigi o erro adicionando restrições ausentes à visualização de conteúdo do uitableviewcell.
1) Limpe as restrições contentView.
2) Defina Redefinir para constantes sugeridas para contentView.
3) Adicionar restrições ausentes - se houver
4) Certificamo-nos de que a visualização do conteúdo possui todas as restrições necessárias.
fonte
No meu caso, é porque estou projetando a célula com xib e esqueci de adicionar esse arquivo xib ao destino.
Depois de adicionar esse arquivo xib ao destino, o problema desaparece
fonte
Embora as respostas nesta página que discutem a adição de restrições de altura ou o retorno manual de rowHeights como 44 em heightForRowAtIndexPath façam com que o aviso desapareça, elas são supérfluas porque este é um bug no Xcode visível pelo menos na versão 6.3.2 (6D2105).
Se você definir um ponto de interrupção em viewDidLoad, verá que self.tableView.rowHeight = -1 (UITableViewAutomaticDimension) mesmo se especificar uma altura de linha de 44 no storyboard. Isso ocorre porque a Apple assume incorretamente que você deseja alturas de linha dinâmicas se deixar a altura de linha em 44, porque eles não forneceram um sinalizador para você especificar sua preferência.
Aqui estão algumas soluções possíveis e seus resultados:
Defina a altura da linha para 43 ou 45 no storyboard (funciona).
Retorne manualmente uma altura de 44 em heightForRowAtIndexPath (funciona).
Adicione restrições de altura entre os elementos UITableViewCell e seu contentView (funciona).
Infelizmente, essas soluções exigem que você altere seu design, adicione restrições desnecessárias ou adicione código desnecessário para contornar um bug. Eu tentei (o que pensei ser) a solução mais simples:
Eu realmente queria uma solução de storyboard pura para isso, então finalmente tentei:

Esses bugs são muito comuns no desenvolvimento do iOS e forçam os desenvolvedores a gastar tempo excessivo pesando as ramificações de como suas soluções afetarão a manutenção a longo prazo.
Já que encontrar uma solução conceitualmente correta que seja sustentável e não pareça ofuscada é tão difícil de entender, e presumir que a Apple consertará o bug e que 44 será a altura padrão da linha em um futuro próximo, então a restrição ou definida pelo usuário as soluções de atributo de tempo de execução são provavelmente as mais fáceis de manter.
fonte
Há duas coisas importantes acontecendo aqui, eu acho.
1) É super fácil fazer as restrições erradas se você estiver pressionando Ctrl + arrastando. Portanto, verifique se você fez isso corretamente. Melhor usar a bandeja no lado esquerdo da tela para desenhar essas restrições.
2) Em vez de especificar o estimadoRowHeight em ViewDidLoad ou em outro lugar, use o método delegado
Isso resolveu o problema imediatamente para mim.
fonte
Também vi esse erro ao usar storyboards universais ou xibs. Se você negligenciar a especificação de restrições adequadas para a classe de tamanho Any x Any, vi este erro aparecer.
A Apple parece ter corrigido isso para iOS9. O erro só aconteceu em 8.4 para mim.
fonte
Passei vários dias entre esse erro e outro erro no qual as restrições estavam sendo criadas (não tenho ideia de onde) que conflitava com as restrições que eu queria. Eu até o fiz funcionar em uma instância em que todas as propriedades visíveis eram idênticas às outras. A única solução que encontrei foi ir atômica - criar um arquivo inteiramente novo com o xib e começar a reconectar os pontos de venda copiando e colando o código antigo. Pode não ser a melhor solução, mas às vezes, se o problema não for visível, não há muito mais o que fazer. No mínimo, tornar-se atômico é uma boa maneira de revisar o que está acontecendo.
fonte