Ответ 1
Эй, почему бы вам не использовать панель навигации в качестве UIToolbar
.
Вместо скрытия UINavigation
вы можете имитировать контроллер навигации до UITootlbar
, добавив к нему кнопки.
скрытие скрытия UINavigation
будет сложным.
У меня есть контроллеры просмотра в контроллере навигации (root: RootViewController
, second: ReadingViewController
), но во втором контроллере представления я хочу отключить панель навигации для UIToolBar
(поскольку мне это не нужно название и хотите больше кнопок, например, в iBooks или приложении Facebook). Проблема в том, что когда я скрываю навигационную панель во втором представлении, она появляется случайным образом еще секунду, когда я выхожу из контроллера вида (вернитесь назад).
Когда я выхожу на контроллер вида, на второй появляется кнопка "Назад":
Во втором контроллере просмотра я скрываю панель навигации в viewWillAppear:
:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES animated:YES];
}
Также во втором контроллере представления я восстанавливаю панель навигации в viewWillDisappear:
:
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
// ... other stuff
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
Мне интересно, как я борюсь с этой проблемой, так что контроллеры представлений легко перемещаются.
Эй, почему бы вам не использовать панель навигации в качестве UIToolbar
.
Вместо скрытия UINavigation
вы можете имитировать контроллер навигации до UITootlbar
, добавив к нему кнопки.
скрытие скрытия UINavigation
будет сложным.
Проблема в том, что viewDidLoad
слишком скоро! Помните, что viewDidLoad
не имеет никакого отношения к интерфейсу и фактической анимации push. Это не значит, что это представление контроллера просмотра должно появиться на экране! Это просто означает, что контроллер вида получил свое представление.
Я сделал видеоролик, показывающий, что происходит на моей машине, когда я перемещаюсь между двумя контроллерами представлений в интерфейсе навигации, один из которых показывает панель навигации, а другой нет: http://youtu.be/PxpchytWQ4A
Для меня это так же логично, как вы собираетесь получать, когда показываете и скрываете навигационную панель, когда вы нажимаете и поп! Вот код, который я использовал. Контроллер вида, который скрывает свою навигационную панель, имеет класс ViewController2. Этот код находится в делегате приложения:
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
dispatch_async(dispatch_get_main_queue(), ^{
[(UINavigationController*)self.window.rootViewController setDelegate:self];
});
return YES;
}
-(void)navigationController:(UINavigationController *)nc
willShowViewController:(UIViewController *)vc
animated:(BOOL)animated
{
[nc setNavigationBarHidden:([vc isKindOfClass:[ViewController2 class]])
animated:animated];
}
Это все, что я сделал.
Во втором представлении контроллер скрыть панель навигации в viewWillAppear::
self.navigationController.navigationBar.frame = CGRectMake(0, 0, 0, 0);
Чтобы открыть панель навигации, установите рамку в viewWillDisappear:
self.navigationController.navigationBar.frame = CGRectMake(0, 0, 320, 44);
Ну, как я понимаю из вашего вопроса, единственной проблемой вашего текущего подхода является временное появление оригинальной кнопки "Назад". Итак, почему бы не просто заблокировать эту кнопку для контроллера вида?
self.navigationItem.hidesBackButton = YES;
Я думаю, это может помочь. Но для вашей основной задачи я предпочел бы вам использовать настраиваемую панель навигации с возможностью добавлять столько кнопок, сколько захотите. Такой подход более естественен для iOS, и вы, вероятно, никогда не столкнетесь с такими проблемами, как вы упомянули в своем вопросе.
Здравствуйте, Следующие вещи выполнили мою работу
В FirstViewController
введите этот метод
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
и в SecondViewController
поместите этот метод
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES animated:YES];
}
Я не использовал viewWillDisappear
для моей работы.
Надеюсь, вам помогут.
Это может быть так же просто, как перемещение вашего кода от viewWillDisappear
до viewDidDisappear
.
Кроме того, избегайте использования анимаций в любом представлении *, которые появляются, поскольку процесс просмотра уже анимируется.
Моя проблема заключается в том, что когда я нажимаю viewController с помощью navigationBar на один без него, используя настраиваемый переход, перемещающий его с левой стороны, я не могу заставить его следовать за вторым кадром контроллера представления. Он всегда падает сверху, создавая очень неприятный эффект всякий раз, когда я выполняю это действие.
Вы можете отобразить панель навигации, которая заставляет ее отображаться в родительском контроллере представления, а затем перевести альфа от 0 до 1:
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
self.navigationController.navigationBar.hidden = NO;
self.navigationController.navigationBar.alpha = 0;
[UIView animateWithDuration:0.3 animations:^{
self.navigationController.navigationBar.alpha = 1;
}];
}