2010-03-04 6 views
5

Étant donné une hiérarchie de vue qui ressemble à ceci:Pose UIView subviews avec des contraintes de taille

ContainerView 
    UIScrollView 
    ModuleView 
    ModuleView 
    ModuleView 
    ... 

Je voudrais le ContainerView de jeter les ModuleViews dans une certaine façon arbitraire (liste, grille, etc.). Pour ce faire, j'implémenterais -[ContainerView layoutSubviews] qui passerait par ModuleViews, appellerait -[ModuleView sizeToFit] sur chacun d'entre eux, puis les positionner l'un par rapport à l'autre selon la disposition désirée. Ma question concerne la meilleure façon d'implémenter -[ModuleView sizeThatFits:] et -[ModuleView layoutSubviews] pour minimiser la répétition et permettre à ModuleViews de changer de taille tout en maintenant la mise en page correctement.

Prenez le cas le plus simple où ModuleView est un UIView avec plusieurs lignes UILabel sous-vue, et le rembourrage de chaque côté. Il pourrait ressembler à ceci:

@implementation ModuleView 

- (CGSize)sizeThatFits:(CGSize)size { 
    CGFloat padding = 10.0f; 
    CGSize labelMaxSize = CGSizeMake(superview.size.width - (2 * padding), CGFLOAT_MAX); 
    CGSize labelSize = [self.label.text sizeWithFont:self.label.font constrainedToSize:labelMaxSize lineBreakMode:self.label.lineBreakMode]; 
    return CGSizeMake(superview.width, labelSize.height + (2 * padding)); 
} 

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    CGFloat padding = 10.0f; 
    CGSize labelMaxSize = CGSizeMake(self.size.width - (2 * padding), CGFLOAT_MAX); 
    CGSize labelSize = [self.label.text sizeWithFont:self.label.font constrainedToSize:labelMaxSize lineBreakMode:self.label.lineBreakMode]; 
    self.label.frame = CGRectMake(padding, padding, labelSize.width, labelSize.height); 

    CGRect frame = self.frame; 
    frame.size.height = self.label.frame.size.height + (2 * padding); 
    self.frame = frame; 
} 

@end 

Comme vous pouvez le voir, la taille de la sous-vues est calculée une fois dans sizeThatFits:, et encore en layoutSubviews. Cela fonctionne, mais devient rapidement un gâchis lorsque les vues sont plus compliquées.

Existe-t-il un moyen de simplifier cela? Je n'ai pas réussi à trouver de bons exemples de la façon dont les autres abordent ce problème.

+0

Salut Nathan, toute nouvelle solution pour une telle situation? – jchatard

Répondre

1

Je suis venu dans le même genre de problème, avec une hiérarchie des vues très complexe. J'ai fini par créer une sous-classe UIView qui seulement agit comme des wrappers contenant mes utiles vues.

Parce que je devais appeler - (void) sizeToFit du haut de la hiérarchie, j'ai besoin d'un moyen d'appliquer ce de de bas en haut. J'ai fait cela en appelant - (void) sizeToFit; sur les sous-vues à partir de l'aperçu - (CGSize) sizeThatFits: taille (CGSize); méthode.

Et puis ceci est fait récursivement.

J'étais tellement coincé sur la façon d'y parvenir dans le bon ordre que j'ai écrit une note à moi-même et j'espère que d'autres. Espérons que cela peut aider: http://jchatard.com/understanding-uiview-layout-mecanism

Questions connexes