Моя основная сцена показывает дочерний элемент UIViewController
, помещая дочерний контейнер в его представление и встраивая дочерний UIViewController в этот дочерний контейнер. Я делаю это, перетаскивая с нажатой клавишей Ctrl из дочернего контейнера в дочерний элемент UIViewController
в storyboard
и выбирая переход «встроить».
Это позволяет мне инкапсулировать и повторно использовать дочерний элемент UIViewController
в другом месте. Я думаю, что это достаточно стандартно. Но я не могу правильно настроить автоматическую компоновку.
Я сделал простой тестовый пример, чтобы продемонстрировать это: https://github.com/murraycu/ios-example-autolayout-of-child-container-views
Он имеет два UIViewControllers
, которые встроены в контроллер вкладок, поэтому вы можете переключаться между ними.
На вкладке «Простой» отображается SimpleViewController
, на котором показано изображение и метка, показанные здесь в раскадровке:
Ни для UIImage, ни для UILabel не указано ограничение высоты, хотя у них есть ограничение Equal Width (равное родительскому представлению), чтобы ширина оставалась простой.
Этот UILabel явно не очень высок, но UIImage и UILabel имеют немного разные приоритеты обтягивания содержимого, что делает их высоты не двусмысленными в соответствии с Auto Layout. Таким образом, благодаря автоматической компоновке, когда я устанавливаю его текст во время выполнения на какой-то текст, который потребует больше места, он занимает больше места, отнимая место у UIImage над ним. Это хорошо - это поведение, которое я хочу, как показано в эмуляторе:
Теперь к проблеме: на вкладке «С дочерним контейнером» отображается WithChildContainerViewController, который показывает то же изображение, но показывает мой ChildViewController (встроенный в дочерний контейнер) вместо UILabel. И этот встроенный ChildViewController показывает UILabel. Вот он в раскадровке:
Однако система автоматической компоновки теперь, похоже, не знает, сколько места нужно дочернему контейнеру для отображения всего текста в метке в моем ChildViewController. Как и на вкладке «Простой», ни для UIImage, ни для дочернего контейнера не указано ограничение по высоте. Теперь XCode жалуется, что «Высота неоднозначна для «представления контейнера». И в симуляторе это выглядит так:
Это улучшится, если я добавлю ограничение в дочерний контейнер, ограничивая его нижнюю часть нижней частью родительского представления, как это было предложено @iphonic: https://github.com/murraycu/ios-example-autolayout-of-child-container-views/commit/1d295fe0a6c4502938f89925d но высота все еще неправильная:
Как я могу сообщить системе автоматической компоновки, что делать? Я думал о реализации встроенного ContentSize UIView, но UIViewController не является UIView.
ChildViewController's View
в отношении контейнера, в котором вы отображаете дочерний элемент. - person iphonic   schedule 23.06.2015