我可以看到这是困扰很多人的事情:/
我有一个具有 4 个视图控制器的 UITabBarController,所有类型均为 UINavigationController。其中一个 navigationController 将 viewController 推送到它的堆栈上,这个 viewController 应该以横向模式/方向呈现。
viewController 是一个图形,它绝对是应用程序中唯一一个对景观有意义的地方。(当它出现时我隐藏了 UITabBar 不会让用户相信这会在任何地方工作)
要使 UITabBarController 正确响应方向的变化,它的所有 viewController 需要从委托方法返回相同的值:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
所以为了适应这种行为,我在属于 UITabBarController 的所有 viewController 中实现了这个方法:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
BOOL canRotate = [defaults boolForKey:@"can_rotate"];
return canRotate;
}
现在的“窍门”是,当我的可横向视图控制器被推送时,我会这样做:
- (void) viewWillAppear:(BOOL)animated {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setBool:YES forKey:@"can_rotate"];
[defaults synchronize];
}
当它弹出时,我这样做:
- (void) viewWillDisappear:(BOOL)animated {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setBool:NO forKey:@"can_rotate"];
[defaults synchronize];
}
这真的很好用。当 viewController 在堆栈上时,我可以旋转设备并且视图随之而来。
然而,问题是,如果用户在横向模式下点击导航栏上的“后退”按钮,从而将 viewController 弹出到前一个 viewController,那么这个“旧”viewController 当然也处于横向模式。更糟糕的是,因为我将 BOOL 设置为 NO,当我将设备定向为纵向模式时,这个“旧”视图控制器无法旋转回来。
有没有办法更新所有内容,以便当我弹出可以处于横向模式的视图控制器时,我的其他视图控制器都不会处于横向模式?
我有点担心,如果这可以从横向到纵向完成,那么从纵向到横向也应该是可能的,从而使我的“黑客”变得不必要..但如果不能,那么我回到第一方:/
希望我很接近,有人可以帮助我到达那里,谢谢:)