我遇到一个问题,我的导航控制器在启动然后取消新的iOS 7后滑动手势后变得无法使用。
一些相关信息:
主页取消隐藏viewWillDisappear
中的导航栏-(void) viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
// Let's hide the navbar when we show the home view
[self.navigationController setNavigationBarHidden:YES];
…
}
-(void) viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
// Let's hide the navbar when we show the home view
[self.navigationController setNavigationBarHidden:NO];
}
当用户点击主页上的活动图标时,活动的视图控制器将被压入堆栈。
如果用户开始在iOS中使用新的后滑动手势,但随后停止手势(即决定不返回),一切看起来都不错。但是,如果用户导致另一个视图控制器被推入导航堆栈,那么唠叨栏就会变得无法使用,用户无法从当前视图控制器导航回来。
备注
答案 0 :(得分:16)
不确定你是否已经解决了这个问题,但我遇到了同样的问题,但有一点不同。如果我将setAnimated设置为NO,则导航堆栈只会混乱。
这样可行:
[self.navigationController setNavigationBarHidden:YES animated:YES];
...
[self.navigationController setNavigationBarHidden:NO animated:YES];
但这不是:
[self.navigationController setNavigationBarHidden:YES animated:NO];
...
[self.navigationController setNavigationBarHidden:NO animated:NO];
如果您真的希望动画因任何原因而变为NO,那么解决方法是将alpha设置为0/1而不是隐藏/取消隐藏NavigationBar:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.navigationController.navigationBar.alpha = 0.0f;
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[self.navigationController.navigationBar setAlpha:1.0f];
}
缺点是没有很好的幻灯片到弹出过渡动画。如果您确实找到了更好的方法,请告诉我们。
UPDATE :现在已经过时了但是我通过不确保在viewWillAppear中恢复当前视图中viewWillDisappear中的任何状态而解决了我的问题。请勿在viewWillDis中删除您无法重新设置的内容。
取消流行动画时会发生这种情况:
我想在这个勇敢的新世界中,viewWillDisappear / viewWillAppear并不总是意味着视图“将”消失/出现:)
答案 1 :(得分:3)
我认为我的解决方案可能会对您有所帮助。
假设您的主页视图控制器的类是HomePageViewController(类名),活动视图控制器也称为ActivityViewController(类名也是)
首先,在您的HomePageViewController的viewWillAppear:
中- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES];
}
其次,在ActivityViewController中,添加以下代码:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
- (void)viewWillDisappear:(BOOL)animated
{
//trick to fix navigationbar disappear problem that when UIScreenEdgePanGesture is happening.
if ([self.navigationController.topViewController isKindOfClass:[HomePageViewController class]]) {
[self.navigationController setNavigationBarHidden:YES animated:YES];
} else {
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
[super viewWillDisappear:animated];
}
答案 2 :(得分:2)
我遇到了同样的问题,在搜索后,看起来如果手势被取消,你就无法收到通知。手势识别器委托中没有-shouldCancel
,导航控制器上没有-willReshowViewController
。所以我的视图控制器需要显示的导航栏(即正在取消的控制器)在self.navigationController.navigationBarHidden = NO
中设置-viewWillAppear
。这样,当取消手势并调用-viewWillAppear
时,导航栏将再次被取消隐藏。据我所知,这是在取消手势时同时使用向后滑动手势和显示/隐藏导航栏没有问题的唯一方法。
答案 3 :(得分:1)
它可以帮助您避免冻结应用程序。
- (void)navigationController:(UINavigationController *)navigationController
didShowViewController:(UIViewController *)viewController
animated:(BOOL)animate
{
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)])
{
if (self.navigationController.viewControllers.count > 1)
{
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
}
else
{
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}
}
}
答案 4 :(得分:0)
我可以使用animated: true
中的viewWillAppear
和第二个视图控制器的animated: false
中的viewWillDisappear
来解决此问题