如何在 iOS 8 上修复横向导航栏项目的高度?

Posted

技术标签:

【中文标题】如何在 iOS 8 上修复横向导航栏项目的高度?【英文标题】:How do I fix the navigation bar item height in landscape on iOS 8? 【发布时间】:2014-11-21 20:59:08 【问题描述】:

在横屏模式下隐藏状态栏似乎是 ios 8 的一项功能。可以get the status bar back,这很好,但我实际上不反对隐藏它,只是我的应用程序中的导航栏被截断了顶部的几个像素,正如你在这个模拟器截图中看到的那样:

看到齿轮图标在屏幕顶部的位置了吗?它应该有更多的喘息空间。

如果我恢复状态栏会更好,但如果我可以让导航栏有更多空间,我不介意将其省略。研究 iOS 8 上的 Messages 应用程序,我发现导航栏的高度与我看到的一样,但撰写按钮变小了。如何更新我的应用以减小横向导航栏项目的大小?

【问题讨论】:

【参考方案1】:

原来我在-viewDidLoad 中设置了那个设置按钮的字体大小(它的标题只有U+2699 (⚙)):

UIBarButtonItem *settingsButton = self.navigationItem.leftBarButtonItem;
[settingsButton setTitleTextAttributes:@NSFontAttributeName: [UIFont systemFontOfSize:28]
                              forState:UIControlStateNormal
];

这就是为什么它在 iOS 8 上在水平方向上太大了,虽然在纵向上正好。

为了解决这个问题,我从-viewDidLoad 中删除了这段代码,并添加了两个新方法来处理它的大小调整:

- (void)setSettingsButtonFontSize:(CGFloat)size 
    UIBarButtonItem *settingsButton = self.navigationItem.leftBarButtonItem;
    [settingsButton setTitleTextAttributes:@NSFontAttributeName: [UIFont systemFontOfSize:size]
                                  forState:UIControlStateNormal
    ];


- (void)setSettingsButtonFontSizeForVerticalSizeClass:(UIUserInterfaceSizeClass)sizeClass 
    [self setSettingsButtonFontSize:sizeClass == UIUserInterfaceSizeClassCompact ? 20 : 28];

第一种方法只是设置指定的字体大小;第二个根据尺寸类参数选择尺寸。

为了使其大小合适,我将此代码添加到-viewWillAppear:

if ([self respondsToSelector:@selector(traitCollection)]) 
    [self setSettingsButtonFontSizeForVerticalSizeClass:self.traitCollection.verticalSizeClass];
 else 
    [self setSettingsButtonFontSize:28];

所以我在 iOS 7 上得到了原始行为,但在 iOS 8 上,当垂直大小类紧凑时,图标的大小变为 20。

最后,我添加了 new-to-iOS-8 方法来处理旋转:

- (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection
              withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator

    [super willTransitionToTraitCollection:newCollection withTransitionCoordinator:coordinator];
    [self setSettingsButtonFontSizeForVerticalSizeClass:newCollection.verticalSizeClass];

所以现在,在 iPhone 上的 iOS 8 上,横向齿轮为 20,纵向齿轮为 28。现在它在风景中看起来不错,不会太拥挤:

【讨论】:

不幸的是,此解决方案不会从 UIBarButtonItem 中删除 底部填充,并且它不适用于图像。我已经对其进行了调查,但未能找到令人满意的解决方案。 barButtonItem.ImageInsets 属性可用于横向模式以将图像推低一点。此外,如果您从 UINavigationController 弹出视图并将其推回(同时仍处于横向状态),则 iOS 会自动将 UIBarButtonItem 居中在 UINavigationBar 中。另一个问题是backButton。无法使用 ImageInsets 属性将其向下推。也许这是一个 iOS 错误。【参考方案2】:

您可能在错误的位置调整框架。我建议在viewDidLayoutSubviews 方法中设置所有框架(即齿轮的框架)。

【讨论】:

作为实验尝试将导航栏的translucent属性设置为NO,看看问题是否仍然存在。 研究 iOS 8 上的 Messages 应用,我发现导航栏的高度与我看到的一样,但是导航项变小了。 所以我'已更新问题以询问如何做到这一点。

以上是关于如何在 iOS 8 上修复横向导航栏项目的高度?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 iOS 7 状态栏高度和宽度问题

导航栏横向图像问题

iOS 11 导航栏高度自定义

更改 iOS Xamarin 表单上的导航栏高度?

iOS 获取状态栏、导航栏、tabBar高度

如何在 iOS 12.2 中更改导航栏高度?