【问题标题】:iOS 11 prefersLargeTitles not displaying until scrolliOS 11 prefersLargeTitles 直到滚动才显示
【发布时间】:2018-06-24 22:41:36
【问题描述】:

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

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

override func viewDidLoad() {
    super.viewDidLoad()

    navigationController?.navigationBar.prefersLargeTitles = true
}

运行我的应用程序时,标题显示为好像 prefersLargeTitles 设置为小,但如果我随后向下滚动,则会出现大标题。

我有 2 个UIViewControllers,它们都正确显示大标题,除了UITableViewController

我尝试了在代码和情节提要中将prefersLargeTitles 设置为true 的不同组合,您可以在其中将Large Title 设置为AutomaticAlwaysNever

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

有其他遇到过这个问题的人能解决吗?

【问题讨论】:

    标签: ios swift uitableview uinavigationcontroller uikit


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!这是唯一对我有用的解决方案!
    【解决方案2】:

    也许您正在重新加载tableView 之前的viewDidLoad?我今天观察到同样的行为。在我的例子中,我在一个名为tableView.reloadData 的变量上设置了viewDidLoad 之前的didSet

    我能够通过添加保护来解决此问题,因此 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 最初加载之后才被调用时才重新添加。

    【讨论】:

    • 这解决了我几个月来一直存在的问题。在我的例子中,我在 didSet 块中设置表视图数据源,它生成了您描述的确切行为。
    【解决方案3】:

    您需要在导航控制器上启用大标题。很难找到,所以请看下面的截图。

    如果您的表视图控制器继承到其他详细视图控制器,那么您应该在情节提要中为其他视图控制器设置 large titleNever

    不要在这样的代码中与prefersLargeTitles 混淆:

          self.navigationController?.navigationBar.prefersLargeTitles = false
    

    【讨论】:

      猜你喜欢
      • 2017-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多