2010-03-04 29 views
5

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.

+0

Hola Nathan, ¿alguna nueva solución para una situación como esta? – jchatard

Respuesta

1

He tenido el mismo tipo de problema, con una jerarquía de vistas realmente compleja. Terminé creando una subclase UIView que solo actúa como envoltorios que contienen mi útil vistas.

Porque necesitaba llamar - (void) sizeToFit desde la parte superior de la jerarquía Necesito una forma de aplicar este tamaño de abajo hacia arriba. Hice esto llamando a - (void) sizeToFit; en las subvistas desde el tamaño de la supervista - (CGSize) sizeThatFits: (CGSize); método.

Y luego esto se hace recursivamente.

Estaba tan atrapado en cómo lograr esto en el orden correcto que me escribí una nota y espero que otros. Espero que esto pueda ayudar: http://jchatard.com/understanding-uiview-layout-mecanism

Cuestiones relacionadas