Динамически увеличивать/уменьшать высоту пользовательского UINavigationBar
Я следил за этим сообщением , в котором объясняется, как вы можете реализовать пользовательский UINavigationBar
, который имеет увеличенную высоту, если, например, вы хотели поместить дополнительные элементы ui в панель навигации под остальной частью содержимого панели, которая будет сохраняться между навигацией в стеке. Этот код работает очень хорошо в случае, когда вы всегда хотите, чтобы это была увеличенная высота.
В моем приложении мне нужно запустить панель навигации со своей высотой по умолчанию, а затем увеличить ее позже, добавив больше контента после того, как пользователь выполнит задание. Очень похоже на информацию о композиции и элементы управления в магазине iTunes Store:
![enter image description here]()
Итак, я поместил некоторые проверки, чтобы не переделать ничего, если свойство BOOL
NO
. Когда я устанавливаю его на YES
, я вызываю [self setNeedsDisplay]
, который вызывается layoutSubviews
, чтобы правильно позиционировать его на основе этого логического значения. sizeThatFits
также вызывается, и я возвращаю правильную высоту.
Проблема в том, что я не могу называть [self setTransform:CGAffineTransformMakeTranslation(0, -(NavigationBarHeightIncrease))];
в initialize
. Вместо этого я вызываю, что в то же время я изменяю значение boolean на YES
. Из-за этого все мои элементы перемещаются вверх по этой сумме. Но если я не вызываю setTransform
, элементы в навигационной панели находятся в правильном положении, но сама панель расположена слишком далеко вниз, так что пользовательский вид, который я добавил в панель, отображается над таблицей вид контроллера - он истекает кровью, а дополнительное пространство, которое я добавил, является черным, а не фоном цвета панели навигации.
Если я вызываю setTransform
в initialize
, когда высота является высотой по умолчанию, элементы перемещаются вверх, когда они не должны быть.
Итак, как я могу правильно динамически изменять высоту и позиционирование подкласса UINavigationBar
?
Ответы
Ответ 1
Как было предложено в комментариях, для достижения поведения, когда пользовательская панель навигации (не подклассификация встроенного элемента управления) сохраняется в точках и попсах контроллеров в контроллере навигации, вам необходимо иметь один контроллер с настраиваемой навигацией бар, а затем один встроенный вид, который разрешает UINavigationController
с его контроллерами представлений. Затем также необходимо будет установить делегат контроллера навигации в корневой контроллер, чтобы заголовок и другие свойства могли быть обновлены по мере того, как субконтроллеры выталкиваются и выталкиваются. Я представил скриншот ниже того, что может выглядеть версия раскадровки:
![пример встроенного навигационного контроллера]()
Ответ 2
Опция заключается в создании UIViewController в раскадровке, которая имеет только представление управления, которое вы хотите показать под панелью навигации, при этом все остальное прозрачно. Преимущество здесь заключается в том, что вы разрабатываете это, используя обычные инструменты. Используйте ограничения, чтобы поместить их чуть ниже навигационной панели и установить высоты, ширину и т.д. Ваших представлений.
Если вы хотите показать элемент управления, вы можете создать экземпляр этого UIViewController и удалить из него вид содержимого и добавить его в иерархию представления того, что находится на экране.
Существует два варианта вставки извлеченного базового представления:
-
Если вы добавите этот вид управления в контроллер вида в верхней части
стек навигации (что на экране), он будет
вы нажимаете на новый контроллер. Это не то, что вы сказали, что хотите.
-
Если вы добавите этот элемент управления в self.navigationController.view, тогда
он будет сохраняться через толчки и всплывающие окна. Это то, что вы сказали, что хотите.
Я использую этот подход для предоставления всплывающих подсказок для описания того, что на экране. В зависимости от того, использую ли я вариант 1 или 2, я могу сохранить помощь через несколько нажатий/всплывающих окон.
У меня появилась идея из этого руководства, в котором описывается общий подход: http://blog.typpz.com/2013/12/09/ios-sdk-create-a-pop-up-window/
Эта ссылка содержит полный пример кода о том, как открыть представление и удалить представление.
Это позволит вам создавать его в IB, присутствовать и отклонять его по мере необходимости и сохранять его в навигационных последовательностях.
Надеюсь, что это поможет.