带2个导航栏的导航控制器 - 如何调整推动视图控制器的框架?

时间:2014-03-04 13:40:31

标签: ios objective-c uinavigationcontroller uikit uinavigationbar

我有一个UINavigationController,我需要添加第二个UINavigationBar。这些酒吧都不是半透明的。问题是,我放在这个导航控制器中的视图控制器被我的第二个导航栏部分覆盖。我在哪里调整那些视图控制器视图的帧,以便在可见时更改帧不会产生“闪烁”效果?

编辑: 这是在viewDidLoad:

UINavigationBar *secondaryNavBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 64, self.view.frame.size.width, 50)];
secondaryNavBar.translucent = NO;
if ([secondaryNavBar respondsToSelector:@selector(setBarTintColor:)]) { //it has to work on iOS 6 as well
    secondaryNavBar.barTintColor = [UIColor darkGrayColor];
    secondaryNavBar.tintColor = [UIColor whiteColor];
}
else {
    secondaryNavBar.tintColor = [UIColor darkGrayColor];
}
[self.view addSubview:secondaryNavBar];
self.secondaryNavBar = secondaryNavBar;

1 个答案:

答案 0 :(得分:1)

这是一个工作解决方案。当然不是最好的,我没有支持iOS 6,你将不得不对它进行测试并进行测试。

CustomNavigationController.m:

@implementation CustomNavigationController {

    UINavigationBar *bottomNavBar;
}

- (void)viewDidLoad {

    [super viewDidLoad];        
    [self showNavBar];
}

- (void)showNavBar {

    UINavigationBar *secondaryNavBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 64, self.view.frame.size.width, 50)];
    secondaryNavBar.translucent = NO;
    if ([secondaryNavBar respondsToSelector:@selector(setBarTintColor:)]) { //it has to work on iOS 6 as well
        secondaryNavBar.barTintColor = [UIColor darkGrayColor];
        secondaryNavBar.tintColor = [UIColor whiteColor];
    }
    else {
        secondaryNavBar.tintColor = [UIColor darkGrayColor];
    }

    [self.view addSubview:secondaryNavBar];
    bottomNavBar = secondaryNavBar;

    [self layoutNavBar];
}

- (void)layoutNavBar {

    // Get the currently displayed view
    UIView *contentView = self.topViewController.view;
    // Get its frame and height
    CGRect contentFrame = contentView.frame;
    float height = contentFrame.size.height;

    // Adapt height and y origin with the new nav bar
    contentFrame.size.height = height - bottomNavBar.frame.size.height;
    contentFrame.origin.y = bottomNavBar.frame.origin.y + bottomNavBar.frame.size.height;

    // Set the view's frame
    contentView.frame = contentFrame;

}


@end

ViewController.m:

@implementation ViewController

-(void)viewDidAppear:(BOOL)animated {

    CustomNavigationController *navigation = (CustomNavigationController*)self.navigationController;
    [navigation layoutNavBar];
}

@end

请注意,您必须在layoutNavBar上致电viewDidAppear,否则视频的框架将由您的应用重置。这不是一个非常干净的解决方案,而是一个非常好的解决方案。