web-dev-qa-db-fra.com

iOS8 - les contraintes suggèrent de manière ambiguë une hauteur de zéro

Quelqu'un at-il une idée de comment déboguer cela?

Avertissement une fois seulement: Détection d'un cas où des contraintes suggèrent de manière ambiguë une hauteur de zéro pour la vue de contenu d'une cellule de table. Nous envisageons l’effondrement involontaire et utilisons plutôt la hauteur standard.

Les lignes ont une hauteur fixe définie par

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

Et tous les constraints semblent être heureux ...

100
Chris

Forcer une hauteur de retour et une hauteur estimée a fait disparaître l'avertissement dans mon cas.

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

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

Une autre solution pour laquelle vous n'avez pas besoin des deux substitutions consiste simplement à utiliser self.tableView.rowHeight = 44; dans votre méthode loadView ou init.

127
FBronner

Vous pouvez également ajouter des contraintes verticales à partir du haut et du bas de la vue du contenu. Cela rendra l'autolayout heureux (car il sait maintenant calculer lui-même la hauteur de la cellule).

77
MonsieurDart

Si vous utilisez des contraintes autoLayout et UITableViewAutomaticDimension, cette erreur ne constitue pas un problème erroné à ignorer en remplaçant votre hauteur dans le code. Cela signifie que la détermination automatique de la hauteur de la cellule ne fonctionne pas car vous ne disposez pas des contraintes verticales requises.

Si vous êtes comme moi et que vous rencontrez cette erreur et que vous avez besoin d'aide pour identifier la cellule à l'origine de l'erreur, vous pouvez ajouter la ligne suivante juste avant le retour de votre méthode 'heightforRowAtIndexPath'.

NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);

Cela affichera une longue liste de sections et de lignes, mais l'erreur apparaîtra immédiatement après la cellule en particulier, ce qui vous permettra d'identifier rapidement la cellule à l'origine du problème et de corriger vos contraintes en conséquence. Ceci est particulièrement utile pour les cellules statiques. Remplacer la hauteur par un nombre entré manuellement fonctionnera si vous n'utilisez pas autoLayout et les hauteurs de cellule automatiques, mais désactivera essentiellement ces fonctionnalités, ce qui est une très mauvaise solution si vous essayez de l'utiliser.

Si vous n'utilisiez pas précédemment la méthode 'heightForRowAtIndexPath' mais souhaitez déboguer cette erreur sans annuler votre paramètre UITableViewAutomaticDimension, ajoutez simplement ceci à votre code:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);
    return UITableViewAutomaticDimension;
}
26
user2898617

Il semble y avoir un bogue dans XCode 6.1 qui pose ce problème si vous utilisez la disposition automatique et que vous ne spécifiez pas de valeur pour la hauteur de ligne pour chaque cellule de la vue tableau, mais laissez la valeur "par défaut". En cochant simplement la case "Personnalisé" en regard de la hauteur de la ligne, pour chaque cellule, l'avertissement disparaît.

9
ltm

Oui, vous obtenez toutes les contraintes "heureuses" même dans le cas où vous ne disposez que de contraintes horizontales pour les éléments de la cellule de la vue tableau. J'ai eu le même problème. Vous devez également ajouter des contraintes verticales. Ce faisant, cet avertissement disparaîtra.

3
Juraj Antas

J'ai utilisé Row Height 43 (ou <> 44) dans l'inspecteur de taille de la vue tableau et l'erreur a disparu. En utilisant 44 je reçois l'erreur. Xcode version 6.0.1.

- Cette réponse a été supprimée par un modérateur. Merci de ne pas corriger le problème. Cela résout le problème pour moi et peut le faire pour les autres aussi. Alors, pourriez-vous avoir la gentillesse de ne pas le supprimer à nouveau.

3
teho

Les contraintes peuvent être heureuses pour la mise en page, mais pas pour la hauteur de ligne automatique. Une mise en page heureuse signifierait que le contenu peut être présenté sans ambiguïté. Cela satisferait aux vérifications d'Interface Builder.

Une bonne disposition de la hauteur de ligne automatique signifierait qu'en plus de ce qui précède, vous incluez également des contraintes au bas de la cellule.

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

3
Woodster

Si vous recevez cet avertissement, c'est probablement parce que vous utilisez la mise en page automatique et que vos cellules ne sont soumises à aucune contrainte.

Vous devez soit arrêter d'utiliser la mise en page automatique, soit mettre en œuvre des contraintes qui définissent sans ambiguïté la hauteur des cellules.

Vous pouvez désactiver la mise en page automatique dans le générateur d'interface en décochant l'option "Utiliser autolayout" dans l'inspecteur de fichier de droite.

Si vous choisissez d'utiliser la mise en page automatique et que la hauteur de vos cellules est fixe, l'implémentation des contraintes appropriées devrait être simple. Ajoutez simplement des contraintes de hauteur pour les sous-vues de la vue de contenu de la cellule et implémentez des contraintes d'espace vertical entre les sous-vues et entre les sous-vues et la vue de contenu. Par exemple, si votre cellule contient une étiquette, cela fonctionnera:

contraintes verticales

  1. Contrainte d'espace vertical entre le haut de la vue de contenu et le haut de l'étiquette
  2. Contrainte de hauteur fixe de l'étiquette
  3. Contrainte d'espace vertical entre le bas de l'étiquette et le bas de la vue de contenu

contraintes horizontales

  1. Contrainte d'espace horizontal entre le bord avant de la vue de contenu et le bord avant de l'étiquette
  2. Contrainte de largeur fixe de l'étiquette
  3. Contrainte d'espace horizontal entre le bord de fin de l'étiquette et le bord de fin de la vue de contenu
2
wrightak

Je ne pouvais pas supprimer l'avertissement, mais pour que les contraintes fonctionnent correctement, je définissais la nouvelle propriété de vue de table estimatedRowHeight dans iOS8 à la hauteur fixée et supprimais heightForRowAtIndexPath la mise en oeuvre.

2
amir

Vous pouvez utiliser AutoLayout pour calculer la hauteur qui vous convient. Voici un article de Nice sur Dynamic Cell Height sur iOS 8: http://natashatherobot.com/ios-8-self-sizing-tizing-table-view-cells-with-dynamic-type/

1
ricardopereira

Pour un correctif standard de bog, pas de contrainte, pas d'estimation de hauteur, ni trop d'ingénierie du problème. J'ai créé un projet par défaut, câblé la tableview mais oublié de mettre le délégué de hauteur dans le contrôleur de vue. Pour que cet avertissement disparaisse, vous en avez besoin.

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

Dans le contrôleur de vue de votre table.

1
latenitecoder

Dans Swift forçant une hauteur de retour corrigé mon problème:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    if(indexPath.row == 0){
       return CGFloat(131.0)
    }else if(indexPath.row == 8){
       return CGFloat(97.0)
    }else{
       return CGFloat(44.0)
    }
}
1
King-Wizard

J'utilisais une carte dans uitableviewcell. J'ai changé la hauteur de l'affichage de la carte en 1/3 de la taille de l'écran de l'appareil. J'ai eu la même erreur. J'ai corrigé l'erreur en ajoutant des contraintes manquantes à la vue du contenu de la cellule uitableview.

1) Supprimez les contraintes contentView.

2) Définissez Réinitialiser sur Constantes suggérées sur contentView.

enter image description here

3) Ajouter les contraintes manquantes - le cas échéant

4) Nous nous assurons que la vue du contenu a toutes les contraintes requises. enter image description here

1
A.G

Je pense que deux choses importantes se passent ici.

1) Il est très facile de rendre les contraintes fausses si vous appuyez sur ctrl + glisser. Alors, vérifiez que vous l'avez fait correctement. Il est préférable d’utiliser le bac situé à gauche de l’écran pour dessiner ces contraintes.

2) Plutôt que de spécifier l'estimationRowHeight dans ViewDidLoad ou ailleurs, utilisez la méthode delegate

override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {}

Cela a résolu le problème tout de suite pour moi.

0
Greg

J'ai tourné en rond pendant des jours entre cette erreur et une autre erreur dans laquelle des contraintes étaient créées (aucune idée de l'endroit) qui entrait en conflit avec les contraintes que je recherchais. Je l'ai même eu dans un cas où chaque propriété visible était identique à l'autre. La seule solution que j'ai trouvée était de devenir atomique - créez un fichier entièrement nouveau avec xib et recommencez à reconnecter les prises en copiant-collant l'ancien code. Ce n'est peut-être pas la meilleure solution, mais parfois, si le problème n'est pas visible, il n'y a pas grand-chose à faire. À tout le moins, adopter l’atome est un bon moyen de faire le point sur ce qui se passe.

0
DrWhat

Dans mon cas, c’est parce que je conçois la cellule avec xib et j’oublie d’ajouter ce fichier xib à la cible.

Après avoir ajouté ce fichier xib à la cible, le problème a disparu

0
onmyway133

Bien que les réponses de cette page traitant de l'ajout de contraintes de hauteur ou du renvoi manuel de rowHeights comme 44 dans heightForRowAtIndexPath entraînent la disparition de l'avertissement, elles sont superflues car il s'agit d'un bogue dans Xcode visible dans au moins la version 6.3.2. (6D2105).

Si vous définissez un point d'arrêt dans viewDidLoad, vous verrez que self.tableView.rowHeight = -1 (UITableViewAutomaticDimension) même si vous spécifiez une hauteur de ligne de 44 dans le storyboard. En effet, Apple suppose à tort que vous souhaitez des hauteurs de ligne dynamiques si vous laissez la hauteur de ligne à 44, car ils ne vous ont pas fourni d'indicateur pour spécifier votre préférence.

Voici quelques solutions possibles et leurs résultats:

  • Définissez la hauteur des rangées sur 43 ou 45 dans le scénario (travaux).

  • Retourne manuellement une hauteur de 44 dans heightForRowAtIndexPath (works).

  • Ajouter des contraintes de hauteur entre les éléments UITableViewCell et son contentView (works).

Malheureusement, ces solutions vous obligent à modifier votre conception, à ajouter des contraintes inutiles ou à ajouter du code inutile pour contourner un bogue. J'ai essayé (ce que je pensais être) la solution la plus simple:

  • Définissez la hauteur de chaque UITableViewCell sur 44 (Personnalisé) dans le storyboard (échec).

Je voulais vraiment une solution de scénarimage pure, alors j'ai finalement essayé:

  • Ajoutez un attribut d'exécution défini par l'utilisateur à UITableView dans le storyboard et nommez UITableView avec une note indiquant comment son paramètre rowHeight est défini afin que les futurs développeurs puissent le trouver: (fonctionne):

enter image description here

enter image description here

Ces bogues sont trop fréquents dans le développement iOS et obligent les développeurs à passer trop de temps à peser les conséquences de leurs solutions sur la maintenabilité à long terme.

Puisque trouver une solution conceptuellement correcte qui est maintenable et qui ne semble pas obscurcie est si difficile à atteindre, et en supposant que Apple corrigera le bogue et que 44 sera la hauteur de ligne par défaut pour les prévisions futures, les solutions d'attributs d'exécution contraintes ou définies par l'utilisateur sont probablement les plus faciles à gérer.

0
Zack Morris

J'ai également constaté cette erreur lors de l'utilisation de storyboards ou de xibs universels. Si vous oubliez de spécifier les contraintes appropriées pour la classe de taille Any x Any, j'ai vu cette erreur se produire.

Apple semble avoir résolu ce problème pour iOS9. L'erreur ne s'est produite que sur 8.4 pour moi.

0
David Nix