Константа 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!
я столкнулся с проблемой, когда в первый раз я установил константу ограничения в коде, константа будет установлена, но затем после вызова layoutIfNeeded (), например:
myConstraint.constant = newValue;
[view layoutIfNeeded]
константа вернется к исходному значению! Я мог бы наблюдать за изменением значения в отладчике.
Я, наконец, понял, что это потому, что в раскадровке я установил вариацию константы. Например:
As как только я удалил вариацию, константа ограничения не вернулась к исходному значению с layoutIfNeeded call.
свойство horizontalConstraint должно удерживаться самим представлением. Пока представление живо, свойство не должно быть nil (если вы не установите его в nil явно где-то еще в коде). Дважды проверьте, установили ли вы его на ноль по ошибке.