Размещение UIView подпредставлений с ограничениями размера - PullRequest
5 голосов
/ 04 марта 2010

Учитывая иерархию представлений, которая выглядит примерно так:

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. Это работает, но быстро становится беспорядком, когда представления становятся более сложными.

Есть ли способ упростить это? Мне не удалось найти хороших примеров того, как другие подходят к этой проблеме.

1 Ответ

1 голос
/ 18 мая 2011

Я столкнулся с такой же проблемой, с действительно сложной иерархией представлений. Я закончил тем, что создал подкласс UIView, который только действует как оболочки, содержащие мои полезные представления .

Поскольку мне нужно было вызвать - (void) sizeToFit из верхней части иерархии, мне нужен способ применить это определение размера снизу вверх. Я сделал это, вызвав - (void) sizeToFit; на подпредставлениях справа от суперпредставления - (CGSize) sizeThatFits: (CGSize) size; способ.

И тогда это делается рекурсивно.

Я был настолько застрял в том, как добиться этого в правильном порядке, что написал записку для себя и, надеюсь, других. Надеюсь, что это может помочь: http://jchatard.com/understanding-uiview-layout-mecanism

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...