Как обновить ограничение из раскадровки без IBOutlet или идентификатора?

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

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

    myView.constraints.filter{ $0.firstAnchor is NSLayoutAttribute.bottom }.constant -= 200

«NSLayoutAttribute.bottom» не кажется правильным способом проверки типа привязки.

Как проверить тип ограничений, которые я хочу изменить?

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


person caziz    schedule 22.12.2017    source источник
comment
Зачем вам нужно обновлять ограничения? Есть ли какие-то особые требования?   -  person dahiya_boy    schedule 22.12.2017
comment
Обновленное ограничение будет динамически перемещать вид с клавиатуры; Я хотел, чтобы это был пользовательский класс, поэтому мне не пришлось бы переписывать одну и ту же функциональность для каждого представления, которое в противном случае не нуждалось бы в пользовательской реализации.   -  person caziz    schedule 22.12.2017
comment
Вместо обновления ограничения установите рамку просмотра и используйте uiview.animation для анимации. см. здесь   -  person dahiya_boy    schedule 22.12.2017


Ответы (2)


NSLayoutConstraint из iOS7 имеют свойство с именем identifier, из кода или из IB вы можете установить это свойство.
После этого, чтобы получить искомое ограничение, достаточно просто найти его в определенном представлении.
Рассмотрим это расширение UIView:

func constraint(withIdentifier:String) -> NSLayoutConstraint? {
        return constraints.filter{ $0.identifier == withIdentifier }.first
    }
person Andrea    schedule 22.12.2017
comment
Верно, но я хотел бы избежать создания идентификаторов для всех моих представлений, которым я хочу эту функциональность. Есть ли способ поиска по типу ограничения? - person caziz; 22.12.2017
comment
Да, проверьте этот ответ stackoverflow. ком/вопросы/26833641/ - person Andrea; 22.12.2017
comment
Также этот проект Эрики Садун на GitHub github.com/erica/Auto-Layout-Demystified/tree/master/2ndEdition/ - person Andrea; 22.12.2017

Согласно предложению dahlia_boy, я использовал UIView.animate для достижения этой функциональности, однако это не кажется постоянным:

translatesAutoresizingMaskIntoConstraints = true
UIView.animate(withDuration: 1, animations: {
    self.frame.size.height -= 200
})
person caziz    schedule 22.12.2017