2010-03-04 10 views
5

eine Ansicht Hierarchie gegeben, dass so etwas wie folgt aussieht:Ausbreiten UIView Subviews mit Größenbeschränkungen

ContainerView 
    UIScrollView 
    ModuleView 
    ModuleView 
    ModuleView 
    ... 

Ich mag die ContainerView die ModuleViews aus in einer beliebigen Art und Weise (Liste, Gitter etc.) legen. Um dies zu tun, würde ich implementieren -[ContainerView layoutSubviews], die durch die durchlaufen würde, rufen Sie -[ModuleView sizeToFit] auf jedem, und positionieren Sie sie dann relativ zueinander nach dem gewünschten Layout.

Meine Frage ist mit der besten Art der Implementierung -[ModuleView sizeThatFits:] und -[ModuleView layoutSubviews] zu tun, um Wiederholungen zu minimieren und ModuleViews zu erlauben, die Größe zu ändern, während das Layout korrekt beibehalten wird.

Verwenden Sie den einfachsten Fall, in dem ModuleView eine UIView mit einer Untersicht UILabel und Auffüllen auf beiden Seiten ist. Es könnte wie folgt aussehen:

@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 

Wie Sie sehen können, ist die Größe des Subviews berechnet wird einmal in sizeThatFits: und wieder in layoutSubviews. Das funktioniert, wird aber schnell zu einem Chaos, wenn die Ansichten komplizierter sind.

Gibt es eine Möglichkeit, dies zu vereinfachen? Ich konnte keine guten Beispiele dafür finden, wie andere dieses Problem angehen.

+0

Hallo Nathan, jede neue Lösung für eine solche Situation? – jchatard

Antwort

1

Ich bin in der gleichen Art von Problem mit wirklich komplexen Ansichten Hierarchie gekommen. Ich endete mit der Erstellung einer UIView-Unterklasse, die nur als Wrapper mit meinen nützliche Ansichten fungiert.

Da ich - (void) sizeToFit von der Spitze der Hierarchie aufrufen musste ich eine Möglichkeit, diese Dimensionierung von unten nach oben anwenden. Ich habe dies gemacht, indem ich - (void) sizeToFit; auf Subviews direkt von der Superview - (CGSize) sizeThatFits: (CGSize) Größe; Methode.

Und dann wird dies rekursiv getan.

Ich war so fest daran, wie dies in der richtigen Reihenfolge zu erreichen ist, dass ich eine Notiz an mich selbst und hoffentlich andere schrieb. Hoffe, das kann helfen: http://jchatard.com/understanding-uiview-layout-mecanism

Verwandte Themen