Cas
Normalement vous devriez utiliser l' cellForRowAtIndexPath
délégué de la méthode de configuration de votre cellule. Les informations à la cellule est important pour la façon dont la cellule est établi et que la taille sera.
Malheureusement, l' heightForRowAtIndexPath
délégué méthode est appelée avant que l' cellForRowAtIndexPath
délégué de la méthode on ne peut donc pas dire tout simplement le délégué de revenir à la hauteur de la cellule, car ce sera zéro à l'époque.
Nous avons donc besoin de calculer la taille avant de la cellule est établi dans le tableau. Heureusement, il existe une méthode qui ne fonctionne tout simplement que, sizeWithFont
, qui appartient à la classe NSString. Cependant il y a un problème, pour le calcul de la taille correcte de façon dynamique, il a besoin de savoir comment les éléments de la cellule sera présenté. Je vais faire de ce clair dans un exemple:
Imaginez un UITableViewCell
, qui contient une étiquette nommée textLabel
. Au sein de l' cellForRowAtIndexPath
délégué de la méthode que nous plaçons textLabel.numberOfLines = 0
, qui raconte essentiellement l'étiquette, il peut avoir autant de lignes que nécessaire de présenter le texte pour une largeur spécifique. Le problème se produit si nous donnons textLabel un texte de plus de la largeur d'abord été donnés à textLabel. La deuxième ligne apparaît, mais la hauteur de la cellule ne sera pas ajusté automatiquement et on obtient un foiré à la recherche de table.
Comme dit précédemment, on peut utiliser sizeWithFont
pour calculer la hauteur, mais il doit savoir quelle est la Police utilisée, pour la largeur, etc. Si, pour des raisons de simplicité, nous venons de soins sur la largeur, on pourrait coder en dur que la largeur doit être d'environ 320.0 (en ne prenant pas de rembourrage en considération). Mais qu'arriverait-il si nous avons utilisé UITableViewStyleGrouped au lieu de la plaine de la largeur serait alors autour de 300,0 et la cellule serait encore foiré. Ou ce qui se fait si on les échange de portrait à paysage, nous avons beaucoup plus d'espace, mais il ne sera pas utilisé depuis que nous avons codé en dur 300.0.
C'est le cas où, à un certain point, vous devez vous poser la question, combien pouvez-vous éviter de coder en dur.
Mes Propres Pensées
On pourrait appeler l' cellForRowAtIndexPath
méthode qui appartient à la UITableView classe pour obtenir la cellule pour une section donnée et de la ligne. J'ai lu quelques posts qui dit que vous ne voulez pas le faire, mais je ne comprends pas vraiment. Oui, je suis d'accord c'est déjà allouer de la cellule, mais l' heightForRowAtIndexPath
délégué de la méthode n'est appelée que pour les cellules qui seront visibles jusqu'à la cellule sera alloué de toute façon. Si vous l'utilisez correctement l' dequeueReusableCellWithIdentifier
la cellule ne sera pas alloué de nouveau dans l' cellForRowAtIndexPath
méthode, au lieu d'un pointeur est utilisé et les propriétés sont juste ajusté. Alors quel est le problème?
Notez que la cellule n'est PAS tracée à l'intérieur de l' cellForRowAtIndexPath
délégué de la méthode, lorsque la vue de la table de la cellule devient visible le script appelle l' setNeedDisplay
méthode sur la UITableVieCell qui déclenche l' drawRect
méthode pour dessiner la cellule. Donc, l'appel de la cellForRowAtIndexPath
délégué directement ne perdrez pas les performances, car il doit être établi, à deux reprises.
Ok, donc, en appelant l' cellForRowAtIndexPath
délégué de la méthode au sein de l' heightForRowAtIndexPath
délégué de la méthode que nous recevons toutes les informations dont nous avons besoin sur la cellule pour déterminer sa taille.
Peut-être que vous pouvez créer votre propre sizeForCell
méthode qui s'exécute à travers toutes les options, si la cellule est en Valeur1 style, ou Valeur2, etc.
Conclusion/Question
C'est juste une théorie que j'ai décrit dans mes pensées, je voudrais savoir si ce que j'ai écrit est correct. Ou que peut-être il ya une autre façon de faire la même chose. Notez que je veux être capable de faire des choses aussi souple que possible.