在旋转到横向时自动调整UINavigationBar的大小

时间:2013-04-30 16:37:23

标签: ios ios5 uinavigationcontroller uinavigationbar uinavigationitem

典型的NavController行为是在port / landscape中调整大小。从44px高度到32px我相信(从我的头顶)。

我正在使用故事板并将导航栏包含在VC中,而不是控制器中。在纵向和横向之间旋转时,导航栏不会自动调整大小。

我已经看到了这个答案,但这没有帮助:Resizing UINavigationBar on rotation

导航栏是通过外观控制器,加载在App Delegate:

UIImage *portraitImage = [UIImage imageNamed:@"mainNavBar"];
UIImage *landscapeImage = [UIImage imageNamed:@"mainNavBarLandscape"];
[[UINavigationBar appearance] setBackgroundImage:portraitImage forBarMetrics:UIBarMetricsDefault];
[[UINavigationBar appearance] setBackgroundImage:landscapeImage forBarMetrics:UIBarMetricsLandscapePhone];

[[UINavigationBar appearance] setBackgroundColor:[UIColor blackColor]];
[[UINavigationBar appearance] setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:
                                                       [UIColor colorWithRed:245.0/255.0 green:245.0/255.0 blue:245.0/255.0 alpha:1.0], UITextAttributeTextColor,
                                                       [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5],UITextAttributeTextShadowColor,
                                                       [NSValue valueWithUIOffset:UIOffsetMake(0, 1)],
                                                       UITextAttributeTextShadowOffset,nil]];

[[UINavigationBar appearance] setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin];

不幸的是,最后一部分没有区别,因为导航栏将包含在多个控制器中,我不想在上面的问题中重复相同的胶水代码,以回答所有我的VC在旋转时调整大小。

3 个答案:

答案 0 :(得分:5)

如果您使用的是自动布局,UINavigationBar的{​​{1}}会在轮换时正确更新,但其高度intrinsicContentSize则不会。手动调用NSContentSizeLayoutConstraint会告诉autolayout更新导航栏的高度约束。

invalidateIntrinsicContentSize

答案 1 :(得分:4)

[[UINavigationBar appearance] setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin];

但你没有说灵活的身高。然而,正如我所理解的那样,高度是您希望变得灵活的特征。

答案 2 :(得分:0)

接受的答案对我有用,但我想转向完全基于约束的布局。

根据需要在UIBarPosition委托上设置UINavBar。记得在IB中附上代表(当然)。

// In my view controller

#pragma mark - UIBarPositioningDelegate
- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar {
    return UIBarPositionTopAttached;
}

对于IB中UINavBar的约束:

  • 顶部空间:顶部布局指南(0)
  • 领先空间:Superview(0)
  • 培训空间:Superview(0)
  • 最重要的是......没有任何高度限制! -

高度将由运行时的内容大小决定。最初我无法正常工作,因为我的垂直内容拥抱优先级为750,但那是错误的。当我将其更改回默认值(250)时,它工作正常。