Динамически увеличивать/уменьшать высоту пользовательского 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, присутствовать и отклонять его по мере необходимости и сохранять его в навигационных последовательностях.

Надеюсь, что это поможет.