导航控制器子视图中的导航栏初始化为错误的位置(即使它自行修复)

时间:2012-07-18 00:45:34

标签: ios uinavigationcontroller initialization uinavigationbar render

我使用自定义选项卡视图控制器(通过UITabBarDelegate实现)和其中的导航控制器作为子视图。为了让导航控制器的导航栏显示在父标签视图控制器的导航栏下方,我通过创建一个从屏幕顶部开始44像素的CGRect来编程初始化NavigationController。

这可以很好地减去一个小但非常明显的错误。在我父母Tab View Controller首次显示后的瞬间,NavigationController的导航栏开始在它应该的位置下方大约30个像素,留下一些讨厌的空白,然后再跳回到44像素的正确高度(这正是父Tab键控制器的导航栏结束)。下面的前/后截图说明了我在说什么。

The Bad Navigation Bar airs its dirty initialization laundry for all to see!

我应该在哪里移动NavigationController的子视图的初始化和/或视图插入,以隐藏从最终用户调整导航栏的这一点?

目前我有这样的事情,导航控制器的初始化发生在Tab Bar Controller的init方法中,如下所示:

- (id)initWithCoder:(NSCoder *)aDecoder{
    self = [super initWithCoder:aDecoder];
    if (self) {
        self.tab1vc =[[ContactsListViewController alloc] initWithNibName:@"ContactsViewController" bundle:nil];
        self.nav1 = [[UINavigationController alloc] initWithRootViewController:self.tab1vc];
        [nav1.view setFrame:CGRectMake(0, 44, 320, 370)];
        }
    }
    return self;
}

然后我继续在主标签栏控制器的“ViewDidLoad”方法中插入NavigationController的实际视图,如下所示:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.view insertSubview:nav1.view belowSubview:mainTabBar];
    [mainTabBar setSelectedItem:driverListTabBarItem];

}

1 个答案:

答案 0 :(得分:1)

     self.nav1 = [[UINavigationController alloc] initWithRootViewController:self.tab1vc];
     [nav1.view setFrame:CGRectMake(0, 44, 320, 370)];

在你的“self.tab1vc”init方法中,你应该在rootViewController中设置frame.origin

    self.view.frame = CGRectMake(0.0f,0.0f,320,460);

希望这会对你有所帮助。