#iphone #ios #cocoa-touch #uiviewcontroller #uinavigationcontroller
#iPhone #iOS #cocoa-touch #uiviewcontroller #uinavigationcontroller
Вопрос:
Поэтому, прежде чем я добавлю новый ViewController в стек в определенном представлении, я установлю NavigationBar на скрытый, я замечаю, что он исчезает до того, как будет нажат следующий экран и произойдет анимация слайдов (потому что мне нужна UIToolbar вверху).
Итак, вопрос № 1: есть ли способ нажать новый контроллер просмотра и установить панель навигации на скрытую и не получать анимацию скрытия до тех пор, пока новый контроллер просмотра не появится на экране. забавно, что панель навигации скрывается, а затем нажимает на новый контроллер просмотра.
Как только новый контроллер просмотра присутствует, когда я его отключаю, я возвращаю панель навигации обратно
[self.navigationController.navigationBar setHidden:NO];
Но когда она открывается, панель навигации больше не возвращается. Это потому, что эта панель навигации предназначена для текущего NavigationController, а не для нового, который отображается после pop? (вопрос № 2)
Вопрос 3: Понимая, что в ViewController, который отображается после pop, в его viewDidAppear не отображается моя панель навигации, я добавил
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self.navigationController.navigationBar setHidden:NO];
}
который показывает панель навигации, но размер представления неверен, поскольку кажется, что как только панель навигации была скрыта, остальная часть представления заняла пустое пространство, а затем панель навигации находится поверх содержимого. Могу ли я что-нибудь с этим сделать? Или я неправильно подхожу к нему с помощью push и pop?(вопрос № 3).
Спасибо!
Ответ №1:
Я столкнулся с той же проблемой (только наоборот: я начинал со скрытой панели навигации и нажимал на вид, где я хотел, чтобы панель навигации была видна), и на самом деле это очень легко исправить.
Просто замените свои вызовы:
[self.navigationController.navigationBar setHidden:NO];
с
[[self navigationController] setNavigationBarHidden:NO animated:YES];
В моем коде я вызываю эти операторы в - (void)viewWillAppear:(BOOL)animated
методах каждого соответствующего контроллера представления.
Я только что попробовал это решение в том порядке, который вы используете (видимый, затем скрытый), и, похоже, оно работает так же хорошо.
Ответ №2:
Интересная проблема. Вы могли бы попробовать изменить hidden
свойство в viewWillAppear
и viewWillDisappear
, но, похоже, это также может не дать желаемых результатов.
Можете ли вы модально представить контроллер просмотра вместо того, чтобы панель навигации исчезала? Если это последний контроллер просмотра в стеке, это было бы возможно. Для пользователя также может иметь больше смысла видеть, что контроллер просмотра представлен по-другому. Это может указывать пользователю, что переход от этого контроллера просмотра больше не выполняется с помощью кнопки «Назад». Это может быть более разумным, чем просто исчезновение панели навигации.
Если вы все еще хотели, чтобы контроллер просмотра вставлялся справа, я не думаю, что это можно сделать с помощью модального контроллера просмотра. Но вы могли бы сделать это, анимировав представление, которое заполняет экран. (Вы просто добавляете вид с рамкой, у которой origin.x равен ширине экрана. Затем в анимации вы меняете origin.x на 0.0. Дайте мне знать, если вам нужна более подробная информация об этом.)
Тем не менее, я бы рекомендовал представить контроллер представления иначе, чем способ представления, обычно предоставляемый контроллером навигации. Потому что, по сути, вы больше не позволяете пользователю перемещаться из этого представления, как обычно, из навигационного контроллера. (Итак, мой ответ на вопрос № 3 был бы «да».)