Как программно удалить ограничения, которые добавляются из раскадровки?

У меня есть googled, но не узнать ответ. Поэтому мне нужно спросить. У меня есть один домашний экран. Когда пользователь войдет в систему, будет отображаться один вид, как показано ниже. enter image description here Теперь, когда Пользователь вышел из системы и посетил домашнюю страницу, он увидит выше макет, но без макета центра. Если я установил этот макет, он теперь выглядит следующим образом. 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;

Это приведет к тому, что высота станет нулевой. Таким образом, ваш снизу будет охватывать и эту область. Если у вашего представления снизу было ограничение высоты и нижнее пространство для ограничения контейнера? Просто удалите любой из них в качестве вашего требования. Вы