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

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

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

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

【问题讨论】:

    标签: ios iphone uinavigationbar statusbar landscape


    【解决方案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 应用,我发现导航栏的高度与我看到的一样,但是导航项变小了。 所以我'已更新问题以询问如何做到这一点。
    猜你喜欢
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多