É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.
Salut Nathan, toute nouvelle solution pour une telle situation? – jchatard