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

6
典型的NavController行为是在横/竖屏模式下进行调整大小。我想从44px高度缩小到32px(据我所知)。
我正在使用storyboard,并在VC中包含了一个导航栏,而不是控制器。在横向和纵向之间旋转时,导航栏不会自动调整大小。
我看过这个答案,但没有帮助:Resizing UINavigationBar on rotation 导航栏是通过在应用程序委托中加载的外观来控制的:
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个回答

7

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

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

  self.navigationBar?.invalidateIntrinsicContentSize();
}

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

但是你没有提到高度的灵活性。然而,正如我所理解的那样,高度恰恰是您希望具有灵活性的特征。


没错,我也注意到了,就在刚刚发布之后。谢谢。 - StuartM

0

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

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

// In my view controller

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

对IB中的约束条件:

  • 顶部间距:顶部布局指南(0)
  • 主导空间: 父视图(0)
  • 训练空间: 父视图(0)
  • 最重要的是...没有任何高度约束! -

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


上述内容似乎从未调整工具栏的大小。我认为在≤4英寸设备的横向模式下应该是32个点高。这种技术似乎只能处理调整工具栏位置以适应状态栏的存在或缺失。 - Nicholas H.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接