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

Posted

技术标签:

【中文标题】旋转到横向时自动调整 UINavigationBar 的大小【英文标题】:Auto Resizing UINavigationBar on rotation to landscape 【发布时间】:2013-04-30 16:37:23 【问题描述】:

典型的 NavController 行为是在端口/风景中调整大小。从 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 的旋转大小。

【问题讨论】:

【参考方案1】:

如果您使用自动布局,UINavigationBarintrinsicContentSize 会在旋转时正确更新,但其高度 NSContentSizeLayoutConstraint 不会。手动调用invalidateIntrinsicContentSize 告诉自动布局更新导航栏的高度约束。

// View controller
public override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)

  super.viewWillTransition(to: size, with: coordinator);

  self.navigationBar?.invalidateIntrinsicContentSize();

【讨论】:

【参考方案2】:
[[UINavigationBar appearance] setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin];

但你没有说灵活的高度。然而,据我了解,高度正是您希望灵活的特征。

【讨论】:

正确,我在发布后不久也注意到了这一点。谢谢【参考方案3】:

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

UINavBar 委托上设置UIBarPosition 可以根据需要定位事物。记得在 IB 中附加代理(当然)。

// In my view controller

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

关于 IB 中 UINavBar 的约束:

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

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

【讨论】:

上面似乎没有调整工具栏的大小。我相信在 ≤4 英寸的设备上它的横向高度应该是 32 pt。这种技术似乎只负责根据状态栏的存在或不存在调整工具栏位置。

以上是关于旋转到横向时自动调整 UINavigationBar 的大小的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 自动布局和旋转

可以在旋转时自动调整视图的大小以尽可能大吗?

CollectionView 标头不会在自动旋转时调整大小

在 iOS8 中调整旋转工具栏的大小

iOS_book03 -自动旋转自动调整大小尺寸分类器

在横向调整和放置旋转视图:更新约束或平移/更改框架?