web-dev-qa-db-fra.com

Détection d'un cas où des contraintes suggèrent de manière ambiguë une hauteur de zéro

Après la mise à jour vers Xcode 6.1 bêta 2 lorsque j'exécute mon application contenant des cellules tableview, l'assistant de débogage déclare:

Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.

Auparavant, lorsque j'utilisais Xcode 5 sur ce projet, j'avais quelques erreurs, mais celles-ci ont disparu depuis la mise à niveau. Je n'ai pas d'autres erreurs ou avertissements maintenant. J'ai déjà essayé d'ajuster la taille de toutes les cellules de la table et d'utiliser la hauteur standard, mais je reçois toujours le même avertissement:

Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.

J'ai également lu tous les sujets similaires à ce sujet, mais aucune de leurs solutions ne les aide. Lorsque je teste l'application avec le simulateur, l'application fonctionne correctement, à l'exception des images censées figurer dans les cellules de la table de visualisation.

90
David E

Trois choses ont réussi à faire taire cet avertissement jusqu'à présent. Vous pouvez choisir le plus pratique pour vous. Rien de joli cependant.

  • Pour définir la hauteur de cellule par défaut dans viewDidLoad

    self.tableView.rowHeight = 44;
    
  • Accédez au storyboard et modifiez la hauteur des lignes de votre tableview pour qu'elle soit différente de 44. 

  • Pour implémenter la méthode déléguée de tableview, heightForRowAtIndexPath

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return 44;
    }
    

Bizarre.

95
Viktor Kucera

Vous rencontrez l'effet secondaire d'une nouvelle fonctionnalité fantastique dans Tableviews: Automatic Row Heights d'iOS8. 

Dans iOS 7, vous aviez soit des lignes de taille fixe (définies avec tableView.rowHeight), soit vous écriviez du code pour calculer la hauteur de vos cellules et vous retourniez cela dans tableView:heightForRowAtIndexPath. L'écriture de code pour le calcul de la hauteur d'une cellule peut être assez complexe si vous avez plusieurs vues dans votre cellule et que vous avez différentes hauteurs à prendre en compte pour différentes tailles de police. Ajouter dans le type dynamique et le processus était une douleur dans le cul.

Dans iOS 8, vous pouvez toujours effectuer les opérations ci-dessus, mais la hauteur des lignes peut maintenant être déterminée par iOS, à condition que vous ayez configuré le contenu de votre cellule à l'aide de la disposition automatique. Cela représente un avantage considérable pour les développeurs, car à mesure que la taille de la police dynamique change ou que l'utilisateur modifie la taille du texte à l'aide des paramètres d'accessibilité, votre interface utilisateur peut être adaptée à la nouvelle taille. Cela signifie également que si vous avez un UILabel pouvant contenir plusieurs lignes de texte, votre cellule peut désormais s'agrandir pour s'adapter à celles qui le nécessitent et se réduire si ce n'est pas le cas. Il n'y a donc pas d'espaces inutiles. 

Le message d'avertissement que vous voyez vous indique qu'il n'y a pas suffisamment de contraintes dans votre cellule pour que la disposition automatique informe la vue tabulaire de la hauteur de la cellule. 

Pour utiliser la hauteur de cellule dynamique, qui, avec les techniques déjà mentionnées par d'autres affiches, permettra également de supprimer ce message, vous devez vous assurer que votre cellule dispose de suffisamment de contraintes pour lier les éléments de l'interface utilisateur au haut et au bas de la cellule. Si vous avez déjà utilisé la disposition automatique, vous êtes probablement habitué à définir des contraintes Top + Leading, mais la hauteur de ligne dynamique requiert également des contraintes de bas. 

La passe de présentation fonctionne de la manière suivante: elle survient juste avant l’affichage d’une cellule à l’écran:

  1. Les dimensions du contenu avec des tailles intrinsèques sont calculées. Cela inclut UILabels et UIImageViews, où leurs dimensions sont respectivement basées sur le texte ou les images UII qu’ils contiennent. Ces deux vues considèrent que leur largeur est connue (car vous avez défini des contraintes pour les bords arrière/avant, des largeurs explicites ou des contraintes horizontales qui révèlent une largeur d'un côté à l'autre). Supposons qu'une étiquette comporte un paragraphe de texte ("nombre de lignes" étant défini sur 0, le retour à la ligne étant automatique), il ne peut contenir que 310 points; il est donc déterminé que la taille de la police actuelle est de 120 points. 

  2. L'interface utilisateur est aménagée en fonction de vos contraintes de positionnement. Une contrainte au bas de l'étiquette se connecte à la marge inférieure de la cellule. Puisque l'étiquette a atteint 120 points et qu'elle est liée au bas de la cellule par la contrainte, il faut pousser la cellule "vers le bas" (augmentation de la hauteur de la cellule) pour satisfaire la contrainte qui dit "bas de l'étiquette est toujours la distance standard à partir du bas de la cellule. 

Le message d'erreur que vous avez signalé se produit si cette contrainte de fond est manquante. Dans ce cas, rien ne permet de "repousser" le bas de la cellule en l'éloignant du haut de la cellule, ce qui est l'ambiguïté signalée. Au sommet, la cellule s'effondre. Mais la mise en page automatique le détecte également et revient à utiliser la hauteur de ligne standard. 

Pour ce qui est utile, et surtout pour avoir une réponse arrondie, si vous implémentez des hauteurs de rangées dynamiques basées sur la disposition automatique d'iOS 8, vous devez implémenter tableView:estimatedHeightForRowAtIndexPath:. Cette méthode d'estimation peut utiliser des valeurs approximatives pour vos cellules et sera appelée lors du chargement initial de la vue tableau. Cela aide UIKit à dessiner des éléments tels que la barre de défilement, qui ne peut pas être dessiné à moins que la table ne sache combien de contenu elle peut faire défiler, mais elle n’a pas besoin de tailles totalement précises, car c’est juste une barre de défilement. Cela permet de différer le calcul de la hauteur réelle de la ligne jusqu'au moment où la cellule est nécessaire, ce qui nécessite moins de calculs et de présenter votre UITableView plus rapidement. 

177
Woodster

J'ai eu ce problème après avoir créé une UITableViewCell personnalisée et ajouté mes sous-vues à la cellule au lieu de contentView

9
ABakerSmith

Pour résoudre ce problème sans méthode de programmation, ajustez la hauteur des lignes de la vue tableau dans l'inspecteur de taille du storyboard.

enter image description here

8
Anconia

J'ai eu cet avertissement aujourd'hui. Voici ce qui l'a fait disparaître pour moi (dans le constructeur d'interface)

1.Définissez le champ de hauteur de ligne pour la vue tableau sur autre chose que 44.

Je n'ai pas eu à modifier le code

4
humblePilgrim

Activez simplement les cellules d'affichage de la table à redimensionnement automatique

   tableView.estimatedRowHeight = 85.0
   tableView.rowHeight = UITableViewAutomaticDimension

& assurez-vous que vous avez ajouté des contraintes de tous les côtés de UITableViewCell comme- 

 enter image description here

3
Jack

Ceci est un problème d'autolayout. Assurez-vous que vos sous-vues ont toutes les contraintes. Pour moi, la contrainte du bas était manquante pour l'étiquette de titre dans la cellule. Quand j'ai ajouté cela, l'avertissement a disparu et tout s'est parfaitement déroulé. 

3
Alok

Dans xcode 6.0.1, j'avais supprimé ces avertissements spécifiant la hauteur des lignes à l'aide de:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 44.0;
}
1
Fantini

Dans mon cas, je construisais la cellule par programmation et je continuais à avoir cette erreur.

J'ajoutais les sous-vues et les contraintes dans la méthode UITableViewCell de init comme ceci:

addSubview(rankingLabel)
addConstraints(cellConstraints)

J'ai résolu le problème en les ajoutant à la variable contentView de la cellule:

contentView.addSubview(rankingLabel)
contentView.addConstraints(cellConstraints)
1
gohnjanotis

J'ai moi aussi vécu cet avertissement lors du passage à Xcode 6 GM. Je ne recevais cet avertissement que lorsque je remis l'appareil en position initiale.

J'utilise UITableViewCells personnalisé. La vue de la table de storyboard est définie sur ma taille personnalisée (100.0 dans mon cas). Bien que les cellules du tableau soient correctement rendues comme dans les versions précédentes, je n’ai pas aimé le message d’avertissement.

En plus des idées ci-dessus, j'ai ajouté ceci 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 100.0;
}

Le rendu de l'écran ... répond à la rotation et à l'absence de tout autre message d'avertissement.

1
DannyJi

Définissez la hauteur de ligne estimée à zéro et l'avertissement disparaît:

enter image description here

1
TruMan1

Si vous avez créé une table tableViewCell personnalisée pour tableView, assurez-vous d'avoir indiqué les deux contraintes de base et supérieures pour vos cellules. Vous pouvez également obtenir ce message si vos sous-vues à l'intérieur des cellules personnalisées sont alignées au centre Y qui ne ferait apparaître aucun message d'erreur mais gâcherait avec l'identification de la hauteur de la ligne pour tableview à son tour comme dans l'image que j'ai jointe, nous avons ici les deux contraintes supérieure et inférieure

Lorsque vous créez une cellule personnalisée pour table, vous devez spécifier des contraintes de hauteur de ligne ou de haut et de bas spécifiques pour les sous-vues de votre cellule dans la cellule (par exemple, une étiquette dans une cellule personnalisée, comme dans l'image ci-dessous).

Mais si cela ne fonctionne pas, vous pouvez essayer de définir la hauteur des lignes pour votre cellule au lieu d'être automatique comme dans cette image

Mais assurez-vous que si vous désactivez cette case à cocher automatique, vous devez ajuster la taille de votre ligne pour les modifications effectuées par programme, ce qui aurait pu être fait automatiquement.

1
monster pit

Vous pouvez également voir ce message si vos seules contraintes sont définies pour aligner tous les éléments verticalement et que vous n'avez/ne souhaitez pas spécifier de hauteur pour la cellule. Si vous définissez une contrainte haut/bas sur l'élément, l'avertissement disparaîtra.

0
Micah Montoya

Dans le storyboard, définissez le champ cellRow height avec la même valeur que Row height dans tableView (les deux avec la même valeur ont fonctionné pour moi).

Si vous ajoutez la fonction heightForRowAtIndexPath à votre code, cela peut entraîner un problème de performances, car elle sera appelée pour chaque cellule. Soyez donc prudent.

0
Caipivara

J'ai eu ce problème lorsque mes étiquettes et les vues dans la tableViewCell personnalisée ont été contraintes à la customCell, pas sa vue de contenu. Lorsque j'ai effacé les contraintes et les ai connectées aux cellules Content View, le problème a été résolu. 

0
Marija Zivkovic

J'ai la même erreur, en raison de cette ligne, cette erreur a été affichée.

self.layer.backgroundColor = UIColor (blanc: 1, alpha: 0,2) en tant que! CGColor

Je viens de changer la ligne comme suit pour corriger l'erreur

self.layer.backgroundColor = UIColor (blanc: 1, alpha: 0.2) .cgColor

0
Malik Hassnain

J'ai eu le même message d'erreur, Assurez-vous que tous vos points de vente sont valables comme la vue de table et la vue de table

0
Gulz