2009-10-06 5 views
4

J'ai une cellule de table personnalisée qui contient un certain nombre de UILabels. À l'exécution, j'ajuste la hauteur des étiquettes pour qu'elles correspondent à leur contenu en utilisant sizeWithFont:constrainedToSize:lineBreakMode: et en les repositionnant en conséquence. La dernière étiquette de la cellule contient une grande quantité de texte, l'amenant à s'enrouler, et j'ai un problème très étrange. Bien que l'appel sizeWithFont renvoie la taille correcte, et que je mets le cadre UILabel à cette hauteur, il dessine quelques lignes courtes. Cette capture d'écran illustre ce dont je parle:UILabel inside Personnalisé UITableViewCell ne dessine pas à la bonne taille

Screenshot of UILabel problem

Dans cet exemple, la hauteur du bloc plein de texte doit être 90 (comme vérifié dans Interface Builder), et qui est ce qui revient de sizeWithFont. C'est aussi la hauteur à laquelle est définie la frame de UILabel, que j'ai vérifiée en enregistrant et aussi en arrêtant l'exécution et en inspectant la valeur. Cependant, comme vous pouvez le voir, il est évident que dessine les 90 pixels de haut, bien que l'espace soit correctement alloué (la fine ligne noire au-dessus de 'Edité' est la bordure de la cellule du tableau). Je suis complètement perplexe. Si quelqu'un peut donner un aperçu de la raison pour laquelle il se comporte de cette façon, je serais très reconnaissant.

+0

Progrès: cela arrive parce que le La hauteur de la cellule définie dans IB est supérieure à la hauteur réelle retournée par heightForRowAtIndexPath. Quand la cellule est écrasée, il semble qu'il y ait une coupure du UILabel le plus bas. –

+0

Voir ma réponse sur le [même sujet] (http://stackoverflow.com/questions/129502/how-do-i-wrap-text-in-a-alignableviewcell-without-a-custom-cell/905565#905565). –

+0

Cette réponse décrit très bien toutes les choses que je fais déjà :-) –

Répondre

7

Enfin, une solution!

Il s'avère que la cellule fait la mise en page deux fois - une fois pendant heightForRowAtIndexPath, où j'affine toutes les hauteurs des sous-vues et de la cellule, et plus tard pendant une transaction introuvable provenant de __CFRunLoopDoObservers. Comment ai-je retracé cela? J'ai ajouté un layoutSubviews à ma classe de cellule de vue de table personnalisée afin que je puisse l'arrêter.

Lors de la seconde passe, la dernière sous-vue UILabel était réglée sur une hauteur plus courte que celle que je l'ai définie, probablement en accord avec certaines règles d'autoréarisation. (Oui, j'ai essayé de peaufiner tous ces paramètres en premier, sans succès.) En fin de compte, ne rien faire dans layoutSubviews a désactivé ce comportement, me permettant de contrôler complètement la façon dont mes vues sont dessinées.

0

Je me suis battu avec des problèmes similaires. Il s'agissait de faire en sorte que d'autres propriétés soient définies dans les incarnations précédentes de la cellule. Pour le trouver/le prouver, j'ai changé l'identifiant de réutilisation pour la cellule incriminée afin de m'assurer que c'était une cellule unique.

+0

Intéressant ... Je vais regarder dans ce domaine. –

1

Avec iOS 8, ça ne marche plus comme ça. Implémenter layoutSubviews seul ne fait pas l'affaire, car la disposition des sous-vues a déjà changé lorsque la méthode est appelée.

J'ai trouvé 2 solutions:

  1. ajoutant NSLayoutConstraint à la mise en page des sous-vues programme
  2. mise en œuvre layoutSubviews de sous-vue et changer le cadre

Un exemple für solution 2:

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    CGRect frame = self.frame; 
    frame.size.height = 39.f; 
    self.frame = frame; 
} 
Questions connexes