Как обновить ограничение после макета подпредставлений?
Я знаю, что рендеринг вида имеет следующие 3 шага в следующем порядке:
- Обновление ограничений
- макеты просмотров (вот где мы получаем расчет кадров)
- дисплей
Теперь мой вопрос, если я изменю высоту пользовательских кнопок, и эта кнопка имеет ограничение для окружающих видов, как я могу обновить эти ограничения и избежать перекрытия с представлениями? Вы можете видеть закомментированные строки, ни один из них не работает.
class DynamicHeightButton: UIButton {
override func layoutSubviews() {
super.layoutSubviews()
let size = (self.titleForState(UIControlState.Normal)! as NSString).boundingRectWithSize(CGSizeMake(self.bounds.size.width, CGFloat.max), options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: [NSFontAttributeName : UIFont.systemFontOfSize(17)], context: nil)
self.bounds.size.height = size.height + 8
//viewController!.view.setNeedsUpdateConstraints()
//self.setNeedsUpdateConstraints()
//self.setNeedsLayout()
}
}
1 ответ
Решение
При использовании Autolayout вид рамки не должен быть установлен. Вместо этого следует корректировать ограничения, обычно это свойство "константа".
В моем случае я изменяю высоту вида и в процессе нарушаю ограничение.
Я добавил 3 строки в свой пользовательский класс:
@IBOutlet weak var height: NSLayoutConstraint
self.bounds.size.height = size.height + 8
height.constant = size.height + 8