iOS 11偏爱大标题,但直到滚动后才显示

4

我在使用表视图控制器时遇到了iOS 11的大标题问题。

我已经在viewDidLoad中将prefersLargeTitles设置为true:

override func viewDidLoad() {
    super.viewDidLoad()

    navigationController?.navigationBar.prefersLargeTitles = true
}

运行我的应用程序时,标题似乎显示为小号,好像设置了prefersLargeTitles是小的,但如果我向下滚动,大标题将出现。
我有两个UIViewControllers,它们都正确显示大标题,除了UITableViewController
我尝试了不同的方式,在代码和storyboard中将prefersLargeTitles设置为true,你可以将Large Title设置为AutomaticAlwaysNever
我只能在Stack Overflow上找到一个关于这个问题的问题,但是没有任何答案似乎可以解决它。
是否有其他人遇到过这个问题并能够解决它?
3个回答

4
在设置prefersLargeTitles后,您可以通过在UITableView上调用setContentOffset来触发大标题的显示。
override func viewDidLoad() {
    super.viewDidLoad()

    navigationController?.navigationBar.prefersLargeTitles = true
    self.tableView.setContentOffset(CGPoint(x: 0, y: -1), animated: true)
}

1
谢谢!这是唯一对我有效的解决方案! - Adam Zarn

2
也许你在viewDidLoad之前重新加载了tableView?我今天观察到了同样的行为。在我的情况下,我有一个变量的didSet是在viewDidLoad之前设置的,它调用了tableView.reloadData
我通过添加一个保护条件来修复这个问题,所以只有在变量不是之前的nil时才会发生reloadData,这意味着第一次。
以下是我调用的类供参考...
/// Master Controller in UISplitViewController
class MyMasterViewController: UIViewController {

  private let controller = MyTableViewController()

  override func viewDidLoad() {
    super.viewDidLoad()

    controller.instanceVariable = data
    showDetailViewController(navigationController, sender: self)
  }

...

  private func reloadDetail() {
    controller.instanceVariable = newData
  }
}

这里是修复方法 - 在下面添加了 guard 语句...
/// Detail Controller in UISplitViewController
class MyTableViewController: UITableViewController {

  var instanceVariable: MyData! {
    didSet {
      guard oldValue != nil else { return }
      tableView.reloadData()
    }
  }

  // UITableViewController Methods...
}

希望这能帮到你!如果我的例子不太清楚,建议将所有对tableView.reloadData的引用注释掉,然后只在确保它们在tableView初始加载之后才被调用时重新添加。

1
这解决了我几个月以来一直存在的问题。在我的情况下,我是在didSet块中设置表视图数据源,这导致了您描述的确切行为。 - Rodrigo

1
你需要在导航控制器上启用大标题。这有点棘手,因此请参见下面的屏幕截图。 enter image description here 如果你的表视图控制器跳转到其他详细视图控制器,则应该在那些其他视图控制器的storyboard中将large title设置为Never
不要像这样在代码中修改prefersLargeTitles
      self.navigationController?.navigationBar.prefersLargeTitles = false

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