2015-05-07 2 views
15

В моих приложениях я много работаю с ограничениями, в большинстве случаев с анимацией. В определенных обстоятельствах мне нужно удалить ограничения и добавить новые.Правильный способ удаления NSLayoutConstraint

Поскольку мне также нужно поддерживать iOS 7, я не могу использовать свойство active, которое также было бы для меня решением.

Способ устранения ограничений заключается в использовании метода removeConstraint на UIView.

Можно создать метод, как

constraint.remove() 

так что вы не должны знать, какой вид ухаживает за ограничения?

ответ

5

Я закончил с использованием метода autoRemove предоставленный PureLayout библиотеки: https://github.com/smileyborg/PureLayout

Этот метод находит commonSuperview с помощью firstItem или secondItem и снимает ограничение с правильной точки зрения.

Это привело к этому один лайнер:

containerTopConstraint.autoRemove() 
0

Нет, не то, о чем я знаю. Автоматическое управление представлением хоста поступало только в iOS8.

Уродливая реализация может охватывать все ограничения всех видов, чтобы найти вид, где он находится.

Но обычно не должно быть трудно управлять ограничениями таким образом, чтобы вы всегда знали, на каком виде они определены.

+0

Ну, это правда. Я знаю, что это одно из двух взглядов. Но я не хочу каждый раз писать эти утверждения if. Было бы лучше иметь для этого чистое решение. – Antoine

14

Что я могу сделать, это создать массивы ограничений, которые я хотел, чтобы иметь возможность добавлять/удалять и просто использовать следующее:

@property NSMutableArray *newConstraints; 

Заполните newConstraints

iOS7 и iOS8:

[self.viewToChange addConstraints:self.newConstraints]; 
[self.viewToChange removeConstraints:self.newConstraints]; 

или только iOS8, использовать новый механизм

[NSLayoutConstraint activateConstraints:self.newConstraints]; 
[NSLayoutConstraint deactivateConstraints:self.newConstraints]; 

С помощью этого вы можете применить набор, удалить набор и применить новый набор.

Вы также можете создать исходный список из набора раскадровки, если вы можете определить, какие ограничения есть.

+0

Это не моя проблема. Проблема 'viewToChange' является проблемой, поскольку я не всегда знаю, какое представление ухаживает за ограничениями. Вот почему я просто хочу сказать 'constraint.remove()' – Antoine

+0

Извинения, непонятые. Решением было бы отобразить все ограничения, которые имеют значение в словаре, используя их «идентификатор» в качестве ключа и представления в качестве значения. Затем вы можете найти текущее представление, просмотрев идентификатор. Для ручных кодированных ограничений вы можете установить идентификатор в коде. Вы также можете установить его из IB: см. Http: // stackoverflow.com/questions/27791597/is-there-a-way-to-add-an-identifier-to-auto-layout-constraints-in-interface-buil –

+0

Я мог бы использовать этот идентификатор, чтобы найти ограничение, но как это сделать найти правильный вид с использованием этого идентификатора? – Antoine

Смежные вопросы