iOS 11 上未显示导航栏标题和导航按钮

Posted

技术标签:

【中文标题】iOS 11 上未显示导航栏标题和导航按钮【英文标题】:Navigation bar title and navigation buttons not appearing on iOS 11 【发布时间】:2017-08-18 07:53:51 【问题描述】:

ios 11 之前,UINavigationBar 按钮和标题可以正确显示。

昨天我下载了带有 iOS 11 的 Xcode 9,在构建和运行而不做任何更改之后,导航按钮和标题都不再显示。它以我设置的正确颜色显示UINavigationBar,但仅此而已。

我尝试了不同的模拟器,并且我将 iPhone 7 更新到了 iOS 11 beta 5,结果是一样的。什么都没有显示。

有人遇到过同样的问题吗?我尝试更改代码和情节提要的不同部分,但没有任何影响...

用截图编辑:http://imgur.com/a/Hy46c

提前致谢!

【问题讨论】:

这是否可以附加您的项目或代码或屏幕截图或其他 @Anbu.Karthik 我上传了几张截图,说明该项目是私有的。他们来了:imgur.com/a/Hy46c navigationbar.prefersLargeTitles=NO; OR navigationbar.prefersLargeTitles=YES; 根据要求就可以了。 更多信息:这似乎是 Xcode 9 的东西,而不是 iOS 11。我们已经将我们的 iOS 11 版本从 Xcode 8 和 Xcode 9 构建到 iOS 11 设备。只有 Xcode 9 版本存在问题。 这些ios11导航栏bug实在是太烦人了。我想破坏一些东西。 【参考方案1】:

对于 Xcode 9,似乎仅设置注入到 navigationItem titleView 中的自定义视图的框架已经不够了。您的 titleView 的内在内容大小现在也必须被覆盖和设置。

这是代码,调整宽度和高度以满足您的需求:

class NavigationBarTitleView: UIView 

    override var intrinsicContentSize: CGSize 
        return CGSize(width: bounds.width - 100, height: 50)
    

    ...


【讨论】:

【参考方案2】:

使用 sizeToFit()! ios 11 会自动调整大小,但 ios 10 不会

【讨论】:

【参考方案3】:

我遇到了同样的问题,对我来说这是由子类化 UITabBarController 引起的

【讨论】:

我也继承了 UITabBarController。我在 UITabar 中遇到图像和标题的问题,文本会覆盖图像 而具体的原因是我用它来维护旧的iOS标签栏样式: - (UITraitCollection *)traitCollection return [UITraitCollection traitCollectionWithHorizo​​ntalSizeClass:UIUserInterfaceSizeClassCompact]; 【参考方案4】:

您是否在代码中设置了“window,rootViewController = ...”?尝试删除它可以解决您的问题

【讨论】:

哦,天哪,你救了我的命去努力修复它。【参考方案5】:

我在我的项目中遇到了同样的问题,在更新到 Xcode 9 和 iOS 11 后,导航栏中的标题丢失了。我通过转到故事板上导航控制器的导航栏解决了这个问题,并保持 Prefers Large未选中标题并更改标题文本属性下的标题字体,该属性在 Xcode 9 到系统 0 中默认设置为其他选项,如标题 1 或标题。我还将其子视图控制器的导航栏设置“大标题”更改为“从不”而不是“自动”或“始终”。

【讨论】:

【参考方案6】:

我在一些继承的代码库中找到了这段代码,将其注释掉,一切都和 iOS 11.x 之前一样。

if (appDelegate.window.rootViewController != self) 
    appDelegate.window.rootViewController = self;

【讨论】:

【参考方案7】:

尝试使用:

        UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]

或者没有外观代理设置直接到当前的navigationBar...它解决了我的问题,Apple 是否应该将titleText 更改为iOS11 中的默认清除...?

如果您想要与 iOS 10 相同的外观,也可以使用它:

        if #available(iOS 11, *) 
        nav.navigationBar.prefersLargeTitles = false
    

【讨论】:

感谢您的回答,但它不起作用...在进行更改之前,您说,UINavigationBartitleTextAttributesNSColorTextColor 设置为 UIExtendedGrayColorSpace 1 1。添加NSForegroundColorAttributeName 后,只有属性NSColor 与之前的值相同... 经过一番研究,UIExtendedGrayColorSpace 1 1 等于white,所以它已经是正确的颜色...【参考方案8】:

没有显示导航按钮也有同样的问题。我通过将renderingMode设置为.alwaysOriginal解决了这个问题。 (我没有使用模板)

Swift 3 代码:

var img =R.image.smt()?.withRenderingMode(.alwaysOriginal)

【讨论】:

【参考方案9】:

我遇到了同样的问题,但以上都没有解决。 虽然,@Justin Vallely 引导我修复它。

我所做的只是在titleView 上设置width,一切正常!

编辑:

每个UIViewController 都有一个navigationItem 属性,每个navigationItem 都有一个可选的titleView

供参考:https://developer.apple.com/documentation/uikit/uinavigationitem/1624935-titleview

就我而言,我使用的是自定义 titleView,我认为这是问题的原因,因为 Apple 更改了 API 以支持新的导航栏布局。

【讨论】:

什么titleView? 视图控制器上的那个 (UIViewController.navigationItem.titleView) 在 titleView 上设置宽度并没有解决我的问题。我什至尝试过 intrinsicContentSize 都没有成功。 您能提供更多上下文吗? 好的,我解决了我的问题,我有标签栏和导航栏,我的标签栏按钮与标签栏项目的新样式重叠。所以我添加了一个特征集合类,如下所述:***.com/questions/44822558/…。我没有意识到,它破坏了我的导航栏,现在我使用了同一篇文章中提到的稍微不同的解决方案,一切正常。【参考方案10】:

根据 Justin Vallely 的评论,我对代码进行了一些修改,以确保正确调整视图大小:

class NavigationBarTitleView: UIView 
    private var width: CGFloat = 0.0
    private var height: CGFloat = 0.0

    override init(frame: CGRect) 
        super.init(frame: frame)
        width = frame.width
        height = frame.height
    

    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
    

    override var intrinsicContentSize: CGSize 
        return CGSize(width: width, height: height)
    

在我的特殊情况下,我将此视图用作 UISearchBar 的容器,现在它的大小合适,并且可以与 Swift 4 和 iOS 11 完美配合,就像以前在以前的 iOS 和 Swift 版本上工作一样

【讨论】:

【参考方案11】:

我们遇到了同样的问题,导航栏颜色存在,但标题和按钮未显示。我们通过在导航控制器出现在屏幕上 2 秒后触发导航栏背景颜色更改来仔细检查该栏是否存在,因此我们知道导航栏存在并且我们正在向正确的实例添加按钮。和 OP 一样,这个问题只出现在 iOS 11 而不是 iOS 10,我们使用的是运行 Xcode 9.1 的 Swift 3.2。

经过几个小时的摆弄,事实证明,呈现一个导航控制器,然后将其设置为 UIApplication.shared.delegate.window.rootViewController(在当前动画之后)导致了我们案例中的问题。

如果您只是跳过当前视图控制器并将导航控制器作为根视图控制器,那么一切正常。当然,在这种情况下你会失去现在的动画。

【讨论】:

以上是关于iOS 11 上未显示导航栏标题和导航按钮的主要内容,如果未能解决你的问题,请参考以下文章

导航栏项目中未显示标题和后退按钮(iOS 7)

不在导航栏上制作栏按钮项目和标题(iOS,Swift)

UIDocumentPicker 导航栏按钮在 iOS 11 中隐藏

导航栏 rightbaritem 图像按钮错误 iOS 11

iOS - 只显示后退按钮而不显示导航栏的正确方法是啥?

IOS 从动态创建的导航栏显示不同的视图