为什么导航栏内容在iOS 11上显示,但在iOS 10上不显示?

8
我们正在创建一个应用程序,需要使用导航和选项卡视图控制器来连接不同视图的不同标题。初始视图的标题是图像。第二个视图的标题为文本,第三个视图也是如此。
我们正在使用故事板来构建此应用程序,以下是控制器的层次结构。
Navigation Controller --> Tab Bar Controller --> View Controller 1, View Controller 2, View Controller 3

这是我们在第一个视图控制器上显示图片所使用的代码:

    override func viewWillAppear(_ animated: Bool) {
     super.viewWillAppear(animated)

     let titleView = UIImageView()
     titleView.contentMode = .scaleAspectFit
     titleView.image = UIImage(named: "logo_white_thin")

     self.parent?.navigationItem.titleView = titleView
     self.parent?.navigationController?.navigationBar.isHidden = false
     self.navigationController?.navigationBar.isHidden = false
    }

这是我们用来在另外两个视图控制器中展示文本标题的代码。
   override func viewWillAppear(_ animated: Bool) {
    guard let uid = Auth.auth().currentUser?.uid else {return}
    guard let username = users[uid]?.username else {return}

    self.parent?.navigationItem.titleView = title(text: username)
    self.parent?.navigationController?.navigationBar.isHidden = false
    self.navigationController?.navigationBar.isHidden = false

    print("Setting navigation bar title to ", username)
   }

title函数是一个扩展,用于返回一个标签:

   func title(text: String) -> UILabel {
    let label = UILabel()
    label.text = text
    label.textColor = UIColor.white
    label.font = UIFont.boldSystemFont(ofSize: label.font.pointSize)
    return label
   }

现在的问题是,当我们在iOS 11上测试我们的应用程序时,导航控制器正常工作,一切看起来都很好。但当我们在iOS 10上测试我们的应用程序时,导航控制器中的图像和文本神奇地消失了。有任何想法为什么会发生这种情况吗?
这里有一个展示问题的图片: 问题的图片。左边没有标题显示(IOS 10),右边有标题显示(IOS 11) 我正在使用最新版本的Xcode和Swift 4。提前感谢您的任何帮助。

在 title() 方法中尝试设置标签的框架。 - iPatel
@iPatel 我认为这不是title()方法的问题,因为我也有一个视图控制器,其标题是一个ImageView,但它也不会出现... - itsfaraaz
2个回答

5
你需要设置标签的框架。 titleView 是 UIView 的子类,因此它没有内在的 contentSize。然而,iOS 11 为 titleView 提供了内在的 contentSize。所以你不需要设置它的框架。查看这个答案。 iOS 11 navigationItem.titleView Width Not Set
func title(text: String) -> UILabel {
        let label = UILabel()
        // add frame
        label.frame = CGRect(x: 0, y: 0, width: 32, height: 32)
        label.text = text
        label.textColor = UIColor.black
        label.font = UIFont.boldSystemFont(ofSize: label.font.pointSize)
        return label
    }

0
尝试以下步骤:
  1. 将视图控制器层次结构更改为TabbarViewController > NavigationController > ViewController1,ViewController2

enter image description here

  • 为标签添加框架。在iOS 11中,导航栏可以通过其intrinsicContentSize配置标签的框架,但早期的iOS则不行。

  • 通过self.navigationItem.titleView = titleView设置titleView。不要使用self.parent?.navigationItem.titleView = titleView

  • self.navigationController?.navigationBar.isHidden = false就足够了,不必调用self.parent?.navigationController?.navigationBar.isHidden = false


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