Как обновить ограничение после макета подпредставлений?

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

  1. Обновление ограничений
  2. макеты просмотров (вот где мы получаем расчет кадров)
  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
Другие вопросы по тегам