【问题标题】:Navigation bar title and navigation buttons not appearing on iOS 11iOS 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实在是太烦人了。我想破坏一些东西。

标签: ios objective-c xcode ios11 xcode9-beta


【解决方案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 都没有成功。
            • 您能提供更多上下文吗?
            • 好的,我解决了我的问题,我有标签栏和导航栏,我的标签栏按钮与标签栏项目的新样式重叠。所以我添加了一个特征集合类,如下所述:stackoverflow.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(在当前动画之后)导致了我们案例中的问题。

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-01-18
                • 2017-12-19
                • 1970-01-01
                • 2019-01-11
                相关资源
                最近更新 更多