Quelle est la bonne façon d'appeler ?

Je viens de voir dans Facebook SDK pour iOS, ils appellent [super layoutSubviews]; à la fin et non au début de la méthode layoutSubviews. Autant que je sache, nous devrions toujours le faire en première ligne. En faisant cela, peut-il créer un comportement inattendu pour l'interface user?

- (void)layoutSubviews { CGSize size = self.bounds.size; CGSize longTitleSize = [self sizeThatFits:size title:[self _longLogInTitle]]; NSSsortingng *title = (longTitleSize.width <= size.width ? [self _longLogInTitle] : [self _shortLogInTitle]); if (![title isEqualToSsortingng:[self titleForState:UIControlStateNormal]]) { [self setTitle:title forState:UIControlStateNormal]; } [super layoutSubviews]; } 

Selon la reference de class UIView ,

L'implémentation par défaut de cette méthode ne fait rien sur iOS 5.1 et les versions antérieures. Sinon, l'implémentation par défaut utilise les contraintes que vous avez définies pour déterminer la taille et la position des sous-vues.

Ainsi, l'exemple de l'application Facebook SDK appelle [super layoutSubviews] à la fin de son implémentation pourrait être un artefact de l'application initialement créée pour une version iOS antérieure à iOS 5.1.

Pour les versions plus récentes d'iOS, vous devez appeler [super layoutSubviews] au début de votre implémentation. Sinon, la superclass réorganisera vos sous-vues après avoir effectué la layout personnalisée, ignorant ainsi votre implémentation de 'layoutSubviews ()'.

Regardez dans le code, avant [super layoutSubviews], il ne s'agit pas du cadre. Donc, le mettre à la fin peut bien fonctionner aussi. Je suppose que le codeur doit vouloir vérifier le titre et modifier le titre en fonction de certaines règles, il pense que chaque fois que le layoutSubviews est appelé est une bonne occasion de le faire, alors il a mis le code ici.

Vous devez toujours appeler [super layoutSubviews] dernier, si la taille insortingnsèque du contenu d'une vue est modifiée. Si vous changez le titre du button, la taille insortingnsèque du contenu de l' UIButton sera modifiée, donc le dernier appel.

Le premier appel à [super layoutSubviews] est toujours requirejs car iOS met à jour la layout en fonction des contraintes. Cependant, la manière la plus correcte technique de mettre en œuvre votre échantillon devrait être:

 - (void)layoutSubviews { [super layoutSubviews]; CGSize size = self.bounds.size; CGSize longTitleSize = [self sizeThatFits:size title:[self _longLogInTitle]]; NSSsortingng *title = (longTitleSize.width <= size.width ? [self _longLogInTitle] : [self _shortLogInTitle]); if (![title isEqualToSsortingng:[self titleForState:UIControlStateNormal]]) { [self setTitle:title forState:UIControlStateNormal]; } [super layoutSubviews]; }