У меня есть пользовательский вид, который не получает layoutSubview
сообщения во время анимации.
У меня есть вид, который заполняет экран. У него есть настраиваемое подпредставление в нижней части экрана, которое правильно изменяет размеры в Интерфейсном Разработчике, если я изменяю высоту панели навигации. layoutSubviews
вызывается при создании представления, но никогда больше Мои подпредставления правильно выложены. Если я отключаю строку состояния в вызове, подпредставление layoutSubviews
вообще не вызывается, даже несмотря на то, что основной вид оживляет его изменение размера.
При каких обстоятельствах это layoutSubviews
фактически называется?
Я autoresizesSubviews
установил NO
для моего пользовательского просмотра. И в Интерфейсном Разработчике у меня есть верхняя и нижняя распорки и вертикальная стрелка.
Другая часть головоломки заключается в том, что окно должно быть сделано ключом:
[window makeKeyAndVisible];
иначе подпредставления не изменяются автоматически.
источник
layoutSubviews
. Есть лиinitWithFrame:
причинаlayoutSubviews
для вызова?view1.1
то вызовыlayoutSubviews
из,view1
а затемlayoutSubviews
изview1.1
. Этот вызов не распространяется на неопределенный срок до superviews, называя егоview1.1.1
только звонкиlayoutSubviews
наview1.1
иview1.1.1
. Просто движение без изменения его размера не вызываетlayoutSubviews
ни одного из них.view1.2
вview1
,layoutSubviews
изview1.2
иview1
вызываются, ноlayoutSubviews
изview1.1
не вызывается. (view1.1
иview1.2
являются подпредставлениямиview1
). То есть не все подпредставления целевого представления называютсяlayoutSubviews
методом .Основываясь на предыдущем ответе @BadPirate, я немного поэкспериментировал и предложил некоторые уточнения / исправления. Я обнаружил, что
layoutSubviews:
будет вызываться в представлении, если и только если:Некоторые важные детали:
layoutSubviews:
вызывается всякий раз, когда UIScrollView прокручивается, поскольку он выполняет прокрутку, изменяя источник своих границ.layoutSubviews:
когда представление в конечном итоге будет добавлено в иерархию представления .setNeedsLayout
, который устанавливает / поднимает флаг. На каждой итерации цикла выполнения для всех представлений в иерархии представлений этот флаг проверяется. Для каждого просмотра, где флаг поднят,layoutSubviews:
вызывается и флаг сбрасывается. Представления выше по иерархии будут проверены / вызваны первыми.источник
https://developer.apple.com/library/prerelease/tvos/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/CreatingViews/CreatingViews.html#//apple_ref/doc/uid/TP40009503-CH5-SW1
источник
Некоторые из пунктов в ответе BadPirate верны лишь частично:
Для
addSubView
точкиЭто зависит от маски авторазмера вида (целевого вида). Если он имеет маску автоматического изменения размера, layoutSubview будет вызываться на каждом
addSubview
. Если у него нет маски авторазмера, то layoutSubview будет вызываться только при изменении размера кадра представления (целевого представления).Пример: если вы создали UIView программно (по умолчанию он не имеет маски авторазмера), LayoutSubview будет вызываться только тогда, когда кадр UIView изменяется не на каждом
addSubview
.Именно благодаря этой методике производительность приложения также увеличивается.
Для точки вращения устройства
Это может быть правдой только тогда, когда ваш VC находится в иерархии VC (root at
window.rootViewController
), что ж, это наиболее распространенный случай. В iOS 5, если вы создаете VC, но он не добавляется ни в один другой VC, тогда этот VC не будет замечен при повороте устройства. Поэтому его представление не будет замечено при вызове layoutSubviews.источник
Я проследил решение до настойчивости Интерфейсного Разработчика, что пружины не могут быть изменены в представлении, у которого включены моделируемые элементы экрана (строка состояния и т. Д.). Поскольку пружины были отключены для основного вида, это представление не могло изменить размер и, следовательно, было прокручено полностью во время появления панели вызова.
Выключение смоделированных объектов, изменение размера вида и правильная установка пружин привели к возникновению анимации и вызову моего метода.
Дополнительная проблема при отладке заключается в том, что симулятор закрывает приложение, когда статус вызова вызывается через меню. Выйти из приложения = нет отладчика.
источник
вызов
[self.view setNeedsLayout];
viewController заставляет вызывать viewDidLayoutSubviewsисточник
Вы смотрели на layoutIfNeeded?
Фрагмент документации ниже. Работает ли анимация, если вы вызываете этот метод явно во время анимации?
layoutIfNeeded Выкладывает подпредставления, если это необходимо.
Обсуждение Используйте этот метод для принудительного размещения макетов подпредставлений перед рисованием.
Доступность Доступно в iPhone OS 2.0 и более поздних версиях.
источник
При переносе приложения OpenGL из SDK 3 в 4 layoutSubviews больше не вызывался. После долгих проб и ошибок я наконец открыл MainWindow.xib, выбрал объект Window, в инспекторе выбрал вкладку «Атрибуты окна» (крайний левый) и установил флажок «Видимо при запуске». Кажется, что в SDK 3 он все еще вызывал вызов layoutSubViews, но не в 4.
6 часов разочарования подошли к концу.
источник
Довольно неясный, но потенциально важный случай, когда
layoutSubviews
никогда не вызывается:источник