我的iphone应用程序在旋转时显示奇怪的行为:标签栏视图内的导航标题和内容视图之间出现间隙(有关如何重现的详细信息如下)。我创建了一个展示相同问题的小型测试用例:一个自定义的根UIViewController,它以编程方式创建并显示UITabBarController,它有两个选项卡:1)普通的UIViewController,以及2)以单个普通UIViewController内容视图编程创建的UINavigationController
应用程序的完整代码位于根控制器的viewDidLoad中(每个“* VC”类都是一个完全香草的UIViewController子类,带有XIB,用于来自XCode的用户界面,只更改了视图背景颜色以清楚地标识每个视图,没有其他人)。
这里是viewDidLoad代码和shouldAutorotateToInterfaceOrientation代码,这段代码基本上就是整个应用程序:
- (void)viewDidLoad {
[super viewDidLoad];
FirstVC *fvc = [[FirstVC alloc] initWithNibName:@"FirstVC" bundle:nil];
NavContentsVC *ncvc = [[NavContentsVC alloc] initWithNibName:@"NavContentsVC" bundle:nil];
UINavigationController *svc = [[UINavigationController alloc] initWithRootViewController:ncvc];
NSMutableArray *localControllersArray = [[NSMutableArray alloc] initWithCapacity:2];
[localControllersArray addObject:fvc];
[localControllersArray addObject:svc];
fvc.title = @"FirstVC-Title";
ncvc.title = @"NavContents-Title";
UITabBarController *tbc = [[UITabBarController alloc] init];
tbc.view.frame = CGRectMake(0, 0, 320, 460);
[tbc setViewControllers:localControllersArray];
[self.view addSubview:tbc.view];
[localControllersArray release];
[ncvc release];
[svc release];
[fvc release];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
以下是重现问题的方法:
1)开始申请
2)旋转设备(也在模拟器中发生)到横向(UITabBar正确旋转)
3)点击标签2
4)将设备旋转为纵向 - 注意根视图控制器在导航标题栏和导航内容视图下方约10像素高的背景颜色。
5)点击标签1
6)点击标签2
差距消失了!从我的实际应用程序中,我看到在NavigationController选项卡处于活动状态时,所有VC推送和弹出窗口之间的差距仍然存在。切换到另一个选项卡并返回“导航”选项卡可以清除间隙。
我做错了什么?我在SDK 3.1.3上运行,这在模拟器和设备上都会发生。除了这个特殊的序列,一切似乎都很好。救命啊!
答案 0 :(得分:2)
当您将UINavigationController嵌套在另一个UIViewController(在本例中为UITabBarController)中时,会发生此问题。如果您将UINavigationController作为根视图控制器,则不会发生此问题。
一种解决方案可能是进入并更改导航栏的框架(将y原点设置为0到20),但文档明确指出不要这样做。所以对我来说,这表明它不被认为是嵌套UINavigationController的好UI - 你不应该这样做。
请让我知道你的想法 - 谢谢。 :)
答案 1 :(得分:0)
某种情况下,解决方法有效:
旋转后,强制刷新NavigationBar,因此正确调整其视图的帧大小。一些代码如下:
{
// if _navigationController is showing
[_navigationController setNavigationBarHidden:YES];
[_navigationController setNavigationBarHidden:NO];
}