Константа NSLayoutConstraint не обновляется после настройки

У меня есть подкласс UIView с соответствующим xib файлом. В моем xib у меня есть свойство NSLayoutConstraint, которое я пытаюсь оживить. У меня есть метод animateIn. Проблема в том, что работает только метод animateIn. Когда я пытаюсь обновить константу снова, она просто останется в предыдущем значении.

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *horizontalConstraint;

Я пытаюсь обновить константу после нажатия кнопки. Но после настройки константа не обновляется. Он по-прежнему регистрирует 0 даже после установки на -500. Я звоню layoutIfNeeded, но ничего не происходит.

// this works
- (void) animateIn { 
    [UIView animateWithDuration:1.0 delay:2.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
        self.alpha = 1.0;
    } completion:^(BOOL finished) {

        [UIView animateWithDuration:1.0 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
            self.horizontalConstraint.constant = 0;
            [self layoutIfNeeded];
        } completion:^(BOOL finished) {
        }];
    }];
}

// this does not work
- (IBAction)resume:(id)sender {
        self.horizontalConstraint.constant = -500;
        [self layoutIfNeeded];

        NSLog(@"%f",self.horizontalConstraint.constant); // this always stays 0
    }

UPDATE

Кажется, что мой NSLayoutConstraint (null), когда я хочу использовать его во второй раз. Это объясняет, почему оно не обновляется. Как мне сохранить ссылку на него?

Ответ 1

Вам нужно будет вызвать метод setNeedsUpdateConstraints соответствующего UIView(control), в котором присутствует NSLayoutConstraint, чтобы обновить ограничение.

Например, UIButton

self.buttonConstraint.constant = 55;
[self.btnTest setNeedsUpdateConstraints];

В вашем случае

[self setNeedsUpdateConstraints];

Ответ 2

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

[self setNeedsUpdateConstraints];

Ответ 3

Вы уверены, что это ограничение не деактивировано? Установка "активного" свойства ограничения на false приводит к тому, что иерархия представления удаляет ограничение. Если у вас также нет ссылки на него, объект ограничения будет удален из памяти.

У меня была та же проблема, что и вы, и удалил "слабый", поэтому ограничение теперь является сильным свойством. Следовательно, он не установлен на нуль при деактивации (потому что мой контроллер представления всегда имеет сильный указатель на него), и я могу его повторно активировать и повторно установить его константу.

// NB: don't create these contraints outlets as "weak" if you intend to de-activate them, otherwise they would be set to nil when deactivated!
@IBOutlet private var captionViewHeightConstraint: NSLayoutConstraint!

Ответ 4

Свойство horizontalConstraint должно удерживаться самим представлением. Пока представление живое, свойство должно быть не nil (если вы не установите его в nil явно где-то еще в коде). Дважды проверьте, не ошиблись ли вы по ошибке.