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.
Hallo Nathan, jede neue Lösung für eine solche Situation? – jchatard