Autolayout без UIScrollView
Я искал решение этой странной проблемы с автоматической компоновкой. Я пытаюсь настроить UIScrollView подкачки с 5 страницами. Каждая страница имеет свою container
, который является универсальным UIView. Моя текущая настройка выглядит так:
UIView *container = [[UIView alloc] init];
container.translatesAutoresizingMaskIntoConstraints = NO;
NSLayoutConstraint *width =[NSLayoutConstraint
constraintWithItem:container
attribute:NSLayoutAttributeWidth
relatedBy:0
toItem:self.headlineView
attribute:NSLayoutAttributeWidth
multiplier:1.0
constant:0];
NSLayoutConstraint *height =[NSLayoutConstraint
constraintWithItem:container
attribute:NSLayoutAttributeHeight
relatedBy:0
toItem:self.headlineView
attribute:NSLayoutAttributeHeight
multiplier:1.0
constant:0];
NSLayoutConstraint *top = [NSLayoutConstraint
constraintWithItem:container
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.headlineView
attribute:NSLayoutAttributeTop
multiplier:1.0f
constant:0.f];
NSLayoutConstraint *left = [NSLayoutConstraint
constraintWithItem:container
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:self.headlineView
attribute:NSLayoutAttributeLeft
multiplier:index
constant:self.headlineView.frame.size.width];
[self.headlineView addSubview:container];
[self.headlineView addConstraints:@[width, height, top, left]];
Контекст: это вызывается в цикле for, который выполняется 5 раз, где переменная index
увеличивается каждый раз. Это работает правильно.
Основываясь на последнем ограничении, я думал, что это даст желаемый эффект. Множитель каждый раз (0-4) будет перемещать левый край на одну единицу кадра представления прокрутки.
Фактический результат довольно странный. Все 5 представлений расположены на второй странице представления прокрутки, перекрывая друг друга.
Не используются ли множитель и постоянные параметры так, как я думал? Что я тут испортил?
2 ответа
Очевидно, что множитель и постоянные параметры не делают то, что я думал, что они делают (или что они предназначены сделать).
Мой оригинальный макет положить в index
в качестве множителя и ширины просмотра в качестве константы. Однако, оказывается, мне нужно рассчитать все это для постоянного параметра.
CGFloat offset = index * self.headlineView.frame.size.width;
NSLayoutConstraint *left = [NSLayoutConstraint
constraintWithItem:container
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:self.headlineView
attribute:NSLayoutAttributeLeft
multiplier:1.0f
constant:offset];
Лучше всего предположить, что вид не нарисовал рамку self.headlineView
, Если вы положите NSLog(CGStringFromRect(self.headlineView.frame));
прежде чем вы установите ограничения, я бы поспорил, что это будет 0.
Попробуйте позвонить:
[view setNeedsLayout];
[view layoufIfNeeded];
... прежде чем устанавливать ограничения, или попробуйте вызвать метод ограничения внутри viewDidLayoutSubviews
вместо (предполагая viewDidLoad
?).