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?).

Другие вопросы по тегам