【问题标题】:view controller doesn't respect "largeTitleDisplayMode"视图控制器不尊重“largeTitleDisplayMode”
【发布时间】:2021-09-06 02:59:39
【问题描述】:

好像不能设置navigationItem.largeTitleDisplayMode = .always,除非我也设置navigationBar.prefersLargeTitles = true?这是预期的行为吗?

我很难相信苹果会强迫我在导航控制器的每个屏幕上手动设置largeTitleDisplayMode = .never,即使是我无法控制的屏幕,以便只显示一个大屏幕标题。

【问题讨论】:

标签: ios swift uinavigationbar uinavigationitem preferslargetitles


【解决方案1】:

您可以尝试通过像这样的UINavigationControllerDelegate.willShow 调用来控制它。

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationController?.delegate = self
    }
}

// Assumption: ViewController is rootViewController for the UINavigationController
extension ViewController: UINavigationControllerDelegate {
    
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        let isRootVC = (viewController === self)
        viewController.navigationItem.largeTitleDisplayMode = isRootVC ? .always : .never
    }
    
}

更新

另一种选择是对导航堆栈中的 rootViewController 实例的 viewWillAppear(_:)viewWillDisappear(_:) 调用执行相同的管理。

【讨论】:

  • 我宁愿不必走这样的老路。在某些情况下,我可能需要 navigationController 委托并且不能让它被每个视图控制器覆盖
  • 这只能在 rootViewController 上完成 - 不适用于该导航堆栈中的每个 UIViewController 子类。
  • 它仍然覆盖了 navigationController 委托,这有点 hacky,我不想这样做,因为它会导致其他问题。我只想能够为单个视图控制器设置 largeTitleDisplayMode 并让 navigationController 尊重该值
  • 另一种选择是对导航堆栈中的 rootViewController 实例的 viewWillAppear(_:)viewWillDisappear(_:) 调用执行相同的管理。这里没有很好的解决方案。
猜你喜欢
  • 1970-01-01
  • 2019-01-07
  • 2014-12-02
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 2011-09-11
  • 1970-01-01
相关资源
最近更新 更多