iOS 11更喜欢大标题,直到滚动才显示

时间:2018-01-16 09:09:21

标签: ios swift uitableview uinavigationcontroller uikit

使用表视图控制器时,我遇到了iOS 11大型游戏的问题。

我在viewDidLoad中将prefersLargeTitles设置为true:

override func viewDidLoad() {
    super.viewDidLoad()

    navigationController?.navigationBar.prefersLargeTitles = true
}

在运行我的应用时,标题显示为prefersLargeTitles设置为小,但如果我向下滚动,则会显示大标题。

我有2 UIViewControllers,他们都正确显示大标题,禁止UITableViewController

我在代码和故事板中尝试了将prefersLargeTitles设置为true的不同组合,您可以将Large Title设置为AutomaticAlways或{{1 }}

我只能在Stack Overflow上找到另一个问题来引用这个确切的问题,但没有一个答案似乎可以解决它。

遇到此问题的其他人是否能够解决它?

3 个答案:

答案 0 :(得分:1)

您需要在导航控制器上启用大型标题。找到它很棘手,所以请看下面的截图。 enter image description here

如果您的表视图控制器切换到其他详细视图控制器,那么您应该在故事板中为那些其他视图控制器设置large titleNever

请勿在代码中使用prefersLargeTitles

      self.navigationController?.navigationBar.prefersLargeTitles = false

答案 1 :(得分:0)

设置prefersLargeTitles后,您可以通过在UITableView上调用setContentOffset来触发大标题显示。

override func viewDidLoad() {
    super.viewDidLoad()

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

答案 2 :(得分:0)

也许您要在tableView之前重新加载viewDidLoad?我今天观察到了相同的行为。就我而言,我在didSet之前设置的名为viewDidLoad的变量上有一个tableView.reloadData

我能够通过添加防护来解决此问题,因此reloadData仅在变量先前不是nil时才发生,这是第一次。

这是我的电话班供参考...

/// 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之后才调用它们时才重新添加。