2010-05-17 56 views
2

我的iphone应用程序在旋转时显示出奇怪的行为:标签栏视图内的导航标题和内容视图之间出现间隙(有关如何重现的详细信息如下)。我创建了一个小小的测试用例,它展示了相同的问题:一个自定义的根UIViewController,它以编程方式创建并显示一个UITabBarController,它具有两个选项卡:1)简单的UIViewController; 2)UINavigationController,通过一个简单的UIViewController内容视图。旋转和制表符切换后在导航栏和视图之间出现间隙

该应用程序的完整代码位于根控制器的viewDidLoad中(每个“* VC”类都是XIB用于XCode用户界面的完全香草的UIViewController子类,仅更改了视图背景颜色以清楚地标识每个视图,没有其他的)。

这里的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

而且差距了!从我的真实应用程序中,我发现在导航控制器选项卡处于活动状态时,所有VC推送和弹出窗口都会保持空白。切换到不同的选项卡并返回导航选项卡可清除间隙。

我在做什么错?我在SDK 3.1.3上运行,这在模拟器和设备上都会发生。除了这个特定的序列,一切似乎都很好。帮帮我!

回答

2

当您在另一个UIViewController(在本例中为UITabBarController)中嵌套一个UINavigationController时,会出现此问题。如果您将UINavigationController作为根视图控制器,则不会发生此问题。

一种解决方案可能是进入并更改导航栏的框架(将y原点从0设置为20),但文档明确指出不要这样做。所以对我来说,这是一个迹象表明,它不被认为是嵌套UINavigationController的好UI - 你不应该这样做。

请让我知道您的想法 - 谢谢。 :)

+0

要么,或问题是的UITabBarController不根控制器本身。我在使用“自定义”根视图控制器时遇到了很多旋转问题。我已经停止了这样做,并已决定使用UITabBarController或UINavigationController作为我的应用程序的主根控制器,并实现“特殊”启动屏幕作为模式VC“立即”弹出(没有动画),然后是与动画解散。 – Bogatyr 2010-12-30 09:21:29

0

一种解决方法工作在一些场合:

转动后,迫使导航栏的刷新,因此其观点的框架是否正确调整。一些这样的代码:

  • (无效)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation

{

// if _navigationController is showing 
[_navigationController setNavigationBarHidden:YES]; 

[_navigationController setNavigationBarHidden:NO]; 

}

相关问题