Отказ от автоматической компоновки для одного вида? - программирование
Подтвердить что ты не робот

Отказ от автоматической компоновки для одного вида?

У меня есть представление, которое выполняет компоновку своих подзонов в коде. Макет слишком сложный для автоматического макета, а автоматический макет разбивает код макета. Есть ли способ заставить авто макет оставить это представление в отдельности? Я пробовал переопределять layoutSubviews, но без радости.

Спасибо за любую помощь.

4b9b3361

Ответ 1

Авто-макет включен или отключен для раскадровки или XIB. Если ваше представление находится в собственном XIB, вы можете отключить автоматическую компоновку для этого XIB. Если в вашем XIB есть другие представления, которые полагаются на автоматическую компоновку, вам придется найти другое решение.

Ответ 2

Найден ответ в видео WWDC. layoutSubviews не работает одинаково в автоматическом макете, как это было раньше. Это не останавливает автоматическую компоновку, а скорее дает возможность добавлять/изменять/удалять ограничения во время компоновки.

Вчера вечером я попытался переместить пользовательский вид на другой NIB, и это единственное решение.

Ответ 3

Вы можете смешивать автомат и макет вручную

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

class MyView : UIView {

    //
    // mySubview is not involved in any constraints 
    // that would trigger another layout pass.
    // e.g., no explicit constraints set in IB.
    // 
    @IBOutlet weak var mySubview: UIView!

    override func layoutSubviews() {
       super.layoutSubviews()  // let auto layout engine run first

       //
       // Auto layout engine now done with this view so we can
       // set the frames how ever we wish since we have the last
       // word! 
       //
       mySubview.frame  = CGRectMake(...)
       ...

    }

}

Причина, по которой это происходит, заключается в том, что после вызова super.layoutSubviews() изменение фреймов в любых подзапросах не вызывает другого прохода макета (все ограничения, связанные с subviews, удовлетворяются, и механизм автоматического компоновки выполняется с ними); поэтому этот метод получает последнее слово о позиции его подзонов!

  • Обратите внимание, что экземпляры MyView могут иметь связанные ограничения автоматического макета, и все работает нормально.

  • IB не выдает никаких предупреждений, пока вы не устанавливаете каких-либо ограничений для подзонов.