Добрый день, друзья!iOS: программно изменяющиеся ограничения, установленные от Interface Builder
Мне не удалось анимировать представления, которые были установлены в IB из кода. App падает с следующей причине:
Иерархия зрения не готова к ограничению ...
Я видел несколько подобных вопросов здесь, и причина всегда, что вид, который был создан программно, это было еще не добавлено в супервизор. Но я создал все взгляды в IB!
Консоль также говорит:
Просмотр не найден в контейнере иерархии: (здесь идет это SuperView)
Это не имеет никакого смысла для меня, потому что на самом деле это subview соответствующего надзора, и xcode знает это - он печатает иерархию представлений сразу и подходит.
В чем причина? Спасибо!
Edit: код я использую:
- (void)setEditingConstraintsForView:(UIView *)view
{
// Pin given view to top, fix it height
NSDictionary *givenView = @{@"view":view};
view.translatesAutoresizingMaskIntoConstraints = NO;
NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" options:0 metrics:nil views:givenView];
NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view(height)]" options:0 metrics:@{@"height":@(viewHeight)} views:givenView];
[self.animatedVIew addSubview:view];
for (NSArray *constraints in @[horizontalConstraints, verticalConstraints]) {
[view addConstraints:constraints];
}
}
Также я удалить все ограничения, которые я установил в IB перед установкой нового:
- (NSDictionary *)constraintsFromIB
{
if (!_constraintsFromIB) {
_constraintsFromIB = @{@"view1":self.view1.referencingConstraintsInSuperviews,
@"view2":self.view2.referencingConstraintsInSuperviews,
@"view3":self.view3.referencingConstraintsInSuperviews };
}
return _constraintsFromIB;
}
И потом:
- (void)updateViewConstraints
{
[super updateViewConstraints];
// clear all constraints
for (NSString *viewName in self.constraintsFromIB.allKeys) {
for (NSLayoutConstraint *constraint in self.constraintsFromIB[viewName]) {
[constraint remove];
}
} }
UPDATE 2: Метод я использую вызывать изменения: когда пользователь прикасается взгляд, это одна называется:
- (void)animateConstraintsForState:(LDYEditingLabel)state
{
self.editingLabel = state;
[UIView animateWithDuration:0.3 animations:^{
[self updateViewConstraints];
[self.view layoutIfNeeded];
}];
}
Позже в updateViewConstraints:
есть код, который вызывает мой метод setEditingConstraintsForView:(UIView *)view
Можете ли вы показать код? – Paulw11
С каким методом вы вызываете этот код? 'ViewDidAppear'? 'ViewDidAppear'? или какой-либо другой метод? – Paulw11
Просто добавлено другое редактирование. Он запускается из крана на экране с помощью блока анимации. –