Учитывая иерархию представлений, которая выглядит примерно так:
ContainerView
UIScrollView
ModuleView
ModuleView
ModuleView
...
Я бы хотел, чтобы ContainerView
выложил ModuleViews
произвольным образом (список, сетка и т. Д.). Чтобы сделать это, я бы реализовал -[ContainerView layoutSubviews]
, который будет перебирать ModuleViews
, вызывать -[ModuleView sizeToFit]
для каждого из них, а затем располагать их относительно друг друга в соответствии с желаемой раскладкой.
Мой вопрос заключается в том, чтобы наилучшим образом реализовать -[ModuleView sizeThatFits:]
и -[ModuleView layoutSubviews]
, чтобы минимизировать повторения и позволить ModuleViews
изменять размер при сохранении правильной компоновки.
Возьмем простейший случай, когда 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
. Это работает, но быстро становится беспорядком, когда представления становятся более сложными.
Есть ли способ упростить это? Мне не удалось найти хороших примеров того, как другие подходят к этой проблеме.