Я реализую пользовательский контейнер, который очень похож на UINavigationController, за исключением того, что он не содержит весь стек контроллера. У него есть UINavigationBar, который ограничен контроллером контейнера topLayoutGuide, который, как оказалось, 20px сверху, что хорошо.
Когда я добавляю контроллер детского представления и помещаю его представление в иерархию, я хочу, чтобы его topLayoutGuide был замечен в IB и использовался для выделения дочерних элементов представления контроллера дочернего вида, которые появляются в нижней части моей панели навигации. Следует отметить, что должно быть сделано в соответствующей документации:
Значение этого свойства - это, в частности, значение длины свойство объекта, возвращаемого при запросе этого свойства. Эта значение ограничивается либо контроллером представления, либо его закрытием контроллер контейнера (например, панель навигации или вкладки контроллер):
- Контроллер вида, не находящийся в контроллере представления контейнера, ограничивает это свойство, чтобы указать нижнюю часть строки состояния, если она видна,
или указать верхний край представления контроллера вида.- Контроллер представления в контроллере представления контейнера не устанавливает это значение свойства. Вместо этого контроллер представления контейнера ограничивает значение, указывающее:
- Нижняя часть панели навигации, если отображается панель навигации
- Нижняя часть строки состояния, если видна только строка состояния
- Верхний край представления контроллеров просмотра, если не отображается ни строка состояния, ни панель навигации.
Но я не совсем понимаю, как "ограничить его значение", так как оба свойства topLayoutGuide и его длины являются readonly.
Я пробовал этот код для добавления контроллера детского представления:
[self addChildViewController:gamePhaseController];
UIView *gamePhaseControllerView = gamePhaseController.view;
gamePhaseControllerView.translatesAutoresizingMaskIntoConstraints = NO;
[self.contentContainer addSubview:gamePhaseControllerView];
NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-0-[gamePhaseControllerView]-0-|"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(gamePhaseControllerView)];
NSLayoutConstraint *topLayoutGuideConstraint = [NSLayoutConstraint constraintWithItem:gamePhaseController.topLayoutGuide
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.navigationBar
attribute:NSLayoutAttributeBottom
multiplier:1 constant:0];
NSLayoutConstraint *bottomLayoutGuideConstraint = [NSLayoutConstraint constraintWithItem:gamePhaseController.bottomLayoutGuide
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:self.bottomLayoutGuide
attribute:NSLayoutAttributeTop
multiplier:1 constant:0];
[self.view addConstraint:topLayoutGuideConstraint];
[self.view addConstraint:bottomLayoutGuideConstraint];
[self.contentContainer addConstraints:horizontalConstraints];
[gamePhaseController didMoveToParentViewController:self];
_contentController = gamePhaseController;
В IB я определяю "Under Top Bars" и "Under Bottom Bars" для игрыPhaseController. Один из видов специально привязан к верхней направляющей макета, так или иначе на устройстве он выглядит 20px от нижней части панели навигации контейнера...
Каков правильный способ реализации пользовательского контроллера контейнера с таким поведением?