Отказ от автоматической компоновки для одного вида?
У меня есть представление, которое выполняет компоновку своих подзонов в коде. Макет слишком сложный для автоматического макета, а автоматический макет разбивает код макета. Есть ли способ заставить авто макет оставить это представление в отдельности? Я пробовал переопределять layoutSubviews, но без радости.
Спасибо за любую помощь.
Ответы
Ответ 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 не выдает никаких предупреждений, пока вы не устанавливаете каких-либо ограничений для подзонов.