J'utilise des contraintes de mise en page automatique par programme pour mettre en page mes cellules UITableView personnalisées et je définis correctement les tailles de cellule dans tableView:heightForRowAtIndexPath:
Cela fonctionne très bien sur iOS6 et cela a l' air bien dans iOS7 aussi
MAIS lorsque j'exécute l'application sur iOS7, voici le type de message que je vois dans la 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]>
Et en effet, il y a une des contraintes dans cette liste que je ne veux pas:
"<NSAutoresizingMaskLayoutConstraint:0xac6b120 h=--& v=--& V:[UITableViewCellContentView:0xd93e850(44)]>"
et je ne peux pas définir la translatesAutoresizingMaskIntoConstraints
propriété de la contentView
sur NO => cela gâcherait toute la cellule.
44 est la hauteur de cellule par défaut, mais j'ai défini mes hauteurs personnalisées dans le délégué de vue tableau, alors pourquoi la cellule contentView a-t-elle cette contrainte? Qu'est-ce qui pourrait causer cela?
Dans iOS6, cela ne se produit pas et tout va bien sur iOS6 et iOS7.
Mon code est assez gros donc je ne le posterai pas ici mais n'hésitez pas à demander un pastebin si vous en avez besoin.
Pour spécifier comment je le fais, lors de l'initialisation de la cellule:
- Je crée toutes mes étiquettes, boutons, etc.
- J'ai défini leur
translatesAutoresizingMaskIntoConstraints
propriété sur NON - Je les ajoute en tant que sous-vues
contentView
de la cellule - J'ajoute les contraintes sur le
contentView
Je suis également profondément intéressé à comprendre pourquoi cela ne se produit que sur iOS7.
Réponses:
J'ai eu ce problème aussi. Il semble que le cadre de contentView ne soit pas mis à jour jusqu'à ce qu'il
layoutSubviews
soit appelé, mais le cadre de la cellule est mis à jour plus tôt en laissant le cadre de contentView réglé{0, 0, 320, 44}
au moment où les contraintes sont évaluées.Après avoir examiné le contentView plus en détail, il semble que les masques de redimensionnement automatique ne soient plus définis.
La définition du masque autoresizing avant de contraindre vos vues peut résoudre ce problème:
la source
self.contentView.bounds = CGRectMake(0, 0, 99999, 99999);
avant d'ajouter vos contraintes, ce qui devrait résoudre le problème.self.contentView.bounds = CGRectMake(0, 0, 99999, 99999);
fonctionne aussi bien que l'utilisationself.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
. J'ai mis celaupdateConstraints
avant d'ajouter les contraintes à ma vue de contenu.Apparemment, il y a quelque chose qui ne va pas avec UITableViewCell et UICollectionViewCell sur iOS 7 à l'aide du SDK iOS 8.
Vous pouvez mettre à jour le contentView de la cellule lorsque la cellule est réutilisée comme ceci:
Pour UITableViewController statique:
Étant donné que les contrôleurs de vue de table statique sont fragiles et peuvent facilement être cassés si vous implémentez des méthodes de source de données ou de suppression de données, il existe des vérifications qui garantiront que ce code ne sera compilé et exécuté que sur iOS 7
Il est similaire pour UITableViewController dynamique standard:
Dans ce cas, nous n'avons pas besoin de la vérification supplémentaire de compilation, car l'implémentation de cette méthode est requise.
L'idée est la même pour les deux cas et pour UICollectionViewCell, comme commenté dans ce fil: Le problème de redimensionnement automatique du cadre de UICollectionViewCell contentView dans la cellule prototype de Storyboard (Xcode 6, iOS 8 SDK) se produit lors de l'exécution sur iOS 7 uniquement
la source
Comme les cellules sont réutilisées et que la hauteur peut changer en fonction du contenu, je pense qu'en général, il serait préférable de définir la priorité des espacements à moins que nécessaire.
Dans votre cas, UIImageView a un espacement de 15 vers le haut et la vue de dessous a un espacement de 0 vers le bas. Si vous définissez la priorité de ces contraintes sur 999 (au lieu de 1000), l'application ne plantera pas, car les contraintes ne sont pas obligatoires.
Une fois la méthode layoutSubviews appelée, la cellule aura la bonne hauteur et les contraintes peuvent être satisfaites normalement.
la source
Je n'ai toujours pas trouvé de bonne solution pour les storyboards ... Quelques infos aussi ici: https://github.com/Alex311/TableCellWithAutoLayout/commit/bde387b27e33605eeac3465475d2f2ff9775f163#commitcomment-4633188
D'après ce qu'ils y conseillent:
J'ai induit ma solution:
.
.
la source
Augmentez simplement la hauteur de cellule par défaut. Il semble que le problème est que le contenu de la cellule est plus grand que la taille de cellule par défaut (initiale), violant certaines contraintes de non-négativité jusqu'à ce que la cellule soit redimensionnée à sa taille réelle.
la source
UITableViewCellScrollView
) entre la cellule de vue de tableau et le contentView; cela explique probablement la différence entre iOS 6 et 7 ici.Peut-être définir la priorité de la vue sur 750 et moins de 1000 peut résoudre.
la source
J'ai eu le même problème. Ma solution basée sur d'autres ci-dessus:
Meilleur, Alessandro
la source
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.
J'ai également rencontré ce problème et aucune des suggestions n'a aidé. Dans mon cas, j'avais une cellule de sélection de taille et elle contenait collectionView à l'intérieur (chaque cellule collectionView contenait une image en taille réelle). Maintenant, la taille de la cellule était un peu plus grande (60) que la collectionView (50) et les images à l'intérieur (50). En raison de cette vue collectionView a aligné le bas sur la contrainte superview avec une valeur de 10. Ce cas m'a averti, et la seule façon de résoudre ce problème était de rendre la hauteur de cellule identique à celle de collectionView.
la source
J'ai fini par ne pas utiliser du tout UITableViewCell dans le concepteur ... Je crée une vue personnalisée et l'ajoute à la vue du contenu de la cellule par programmation ... Avec certaines catégories d'aide, il n'y a pas non plus de code standard ...
la source
Si cela fonctionne correctement dans iOS8 et obtenir l'avertissement dans iOS7, vous pouvez rechercher le code source du storyboard et trouver la bonne tableviewCell, puis ajouter l'attribut rect après la ligne tableviewCell. Merci à kuchumovn .
la source