Как программно удалить ограничения, которые добавляются из раскадровки?
У меня есть googled, но не узнать ответ. Поэтому мне нужно спросить.
У меня есть один домашний экран. Когда пользователь войдет в систему, будет отображаться один вид, как показано ниже.
Теперь, когда Пользователь вышел из системы и посетил домашнюю страницу, он увидит выше макет, но без макета центра. Если я установил этот макет, он теперь выглядит следующим образом.
![enter image description here]()
Я хочу переместить третий макет чуть выше, чтобы удалить пробел.
Я добавил ограничения с помощью раскадровки. Теперь нужно удалить ограничения из программирования и добавить одно ограничение, которое установит макет для создания первого макета.
Ответы
Ответ 1
Как упоминалось в @Henit, вы также можете установить IBOutlet для ограничений.
Например,
@property(weak, nonatomic) IBOutlet NSLayoutConstraint *viewHeight;
Итак, теперь вы можете удалить это ограничение следующим образом:
[myView removeConstraint: viewHeight];
Или, если вы хотите удалить все/несколько ограничений, связанных с вашим представлением,
[myView removeConstraints: constraintsArrayHere]; // custom array of constraints references
[myView removeConstraints: [myView constraints]]; //all constraints
Затем вы можете добавить новые ограничения тем же способом, используя метод addConstraint
или addConstraints
.
Подробнее об Apple Documentation здесь.
Надеюсь, что это поможет.
Ответ 2
Возьмите IBOutlet ограничения высоты, которое вы хотите скрыть, когда пользователь выходит из системы.
@property(weak, nonatomic) IBOutlet NSLayoutConstraint *viewHeight;
В классе NSLayoutConstraint существует одно свойство константа.
Вы должны установить его, когда пользователь входит в систему/выходит из системы.
viewHeight.constant = isLoggedIn ? 30.0 : 0.0;
Надеюсь, что это поможет.
Ответ 3
Чтобы расширить ответ @Megamind: вы можете использовать свойство active
для NSLayoutConstraint
. Просто установите два разных ограничения для двух случаев и активируйте только один из них в зависимости от состояния входа.
В InterfaceBuilder свойство active
странно называется Installed
:
![Ограничение регистра]()
Затем в вашем кодовом переключателе между двумя:
- (void)setupRegistrationView
{
_loadingIndicatorTopConstraintLogin.active = NO;
_loadingIndicatorTopConstraintRegister.active = YES;
}
- (void)setupLoginView
{
_loadingIndicatorTopConstraintLogin.active = YES;
_loadingIndicatorTopConstraintRegister.active = NO;
}
Кстати, использование нового UIStackView может обеспечить более элегантное решение для вашего дела, но это другая тема.
Ответ 4
removeConstraints будет устаревшим в будущем.
В качестве альтернативы вы можете использовать
viewHeight.active = NO;
Ответ 5
Вы можете сделать это и другим способом. Добавьте ограничение вертикального расстояния между третьей компоновкой и первой компоновкой, которая будет равна 30. Затем добавьте ссылку на ограничение в контроллере.
self.verticalSpacingFromThirdToFirstConstraint.constant = isLoggedIn ? 30.0 : 0.0
PS: В этом случае вы не должны добавлять ограничение высоты для среднего вида. Просто добавьте четыре конечных, ведущих, верхних (до первого макета) и снизу (в третий макет).
Ответ 6
Вы можете добавить ограничение высоты для этого вида, которое вы хотите скрыть.
И добавьте выход NSlayoutHeightcontraint
для этого ограничения высоты в файле viewcontroller.h. Затем вы можете вызвать эту heightConstrain
розетку в файле viewcontroller.m, где вам нужно. Добавьте этот код, где вы хотите скрыть это UIview
:
_heightconstrainOutlet.constant=0;
Это приведет к тому, что высота станет нулевой. Таким образом, ваш снизу будет охватывать и эту область. Если у вашего представления снизу было ограничение высоты и нижнее пространство для ограничения контейнера? Просто удалите любой из них в качестве вашего требования. Вы