ContainerView
UIScrollView
ModuleView
ModuleView
ModuleView
...
我想要
ContainerView
铺设
ModuleViews
以某种任意的方式(列表、网格等)。为此,我将实施
-[ContainerView layoutSubviews]
模块视图
,呼叫
-[ModuleView sizeToFit]
在每一个上,然后根据所需的布局将它们相对放置。
我的问题是如何实施
-[ModuleView sizeThatFits:]
和
-[ModuleView layoutSubviews]
尽量减少重复并允许
模块视图
举个最简单的例子
ModuleView
UIView
多行
UILabel
@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
如您所见,子视图的大小在
sizeThatFits:
,然后在
layoutSubviews
. 这是可行的,但是当视图更复杂时,很快就会变得一团糟。