旋转后,导航栏和视图之间出现间隙。标签切换

时间:2010-05-17 06:28:25

标签: iphone

我的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上运行,这在模拟器和设备上都会发生。除了这个特殊的序列,一切似乎都很好。救命啊!

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

某种情况下,解决方法有效:

旋转后,强制刷新NavigationBar,因此正确调整其视图的帧大小。一些代码如下:

  • (无效)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation

{

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

[_navigationController setNavigationBarHidden:NO];

}