Dada una jerarquía de vistas que se ve algo como esto:Poniendo UIView subvistas con limitaciones de tamaño
ContainerView
UIScrollView
ModuleView
ModuleView
ModuleView
...
Me gustaría que el ContainerView
para sentar las ModuleViews
de alguna manera arbitraria (lista, rejilla, etc.). Para hacer esto, implementaría -[ContainerView layoutSubviews]
que iteraría a través del ModuleViews
, llame al -[ModuleView sizeToFit]
en cada uno, y luego colóquelos uno con respecto al otro según el diseño deseado.
Mi pregunta es la mejor forma de implementar -[ModuleView sizeThatFits:]
y -[ModuleView layoutSubviews]
para minimizar la repetición y permitir que ModuleViews
cambie de tamaño mientras se mantiene el diseño correctamente.
Tome el caso más simple donde ModuleView
es UIView
con una subvista de varias líneas UILabel
, y relleno en ambos lados. Podría ser algo como esto:
@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
Como se puede ver, el tamaño de la subvistas se calcula una vez en sizeThatFits:
, y de nuevo en layoutSubviews
. Esto funciona, pero rápidamente se convierte en un desastre cuando las vistas son más complicadas.
¿Hay alguna manera de simplificar esto? No he podido encontrar buenos ejemplos de cómo otros abordan este problema.
Hola Nathan, ¿alguna nueva solución para una situación como esta? – jchatard