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

у меня есть UIView подкласс с тегом . В моем xib у меня есть NSLayoutConstraint свойство, которое я пытаюсь анимировать. У меня есть 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
    }

обновление

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

5 ответов


нужно позвонить setNeedsUpdateConstraints метод тегом UIView(control) из которых ваш nslayoutconstraint присутствует для обновления ограничения.

например, UIButton

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

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

[self setNeedsUpdateConstraints];

вы уверены, что это ограничение не отключается где-то? Установка свойства "active" ограничения 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!

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

[self setNeedsUpdateConstraints];

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

myConstraint.constant = newValue;
[view layoutIfNeeded]

константа вернется к исходному значению! Я мог бы наблюдать за изменением значения в отладчике.

Я, наконец, понял, что это потому, что в раскадровке я установил вариацию константы. Например:

enter image description here

As как только я удалил вариацию, константа ограничения не вернулась к исходному значению с layoutIfNeeded call.


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