iOS 11偏爱大标题在方向改变后无法扩展

9
我已经实现了iOS 11的功能prefersLargeTitles,它可以正常工作。竖屏模式下一切都按预期进行:

enter image description here

我知道在横屏模式下,大标题将始终处于折叠状态(小),这对我来说没有问题。但是当我尝试从横屏模式切换到竖屏模式时,大标题应该默认扩展(变大),但是除非我向下滚动一点,否则它不会扩展:

enter image description here

我的代码看起来很简单:
if #available(iOS 11.0, *) {
  navigationController?.navigationBar.prefersLargeTitles = true
  navigationItem.largeTitleDisplayMode = .always
}

我尝试使用不同的值来设置tableView.contentInsetAdjustmentBehavior,但是没有任何变化。目前我正在通过编程方式在方向更改后滚动表格来解决这个问题,但我认为这只是一个(不太好的)解决方法。
这是否应该按预期工作?这是我的实现中遗漏的东西吗?有没有更好的解决方法?

你好,你找到解决方案了吗?我也遇到了同样的问题,当切换大标题时,代码如下:self.navigationController?.navigationBar.prefersLargeTitles = !(self.navigationController?.navigationBar.prefersLargeTitles)! - twofish
抱歉,我没有。在方向改变后,我仍然在使用一种解决方法。 - juliancadi
嘿!我也遇到了同样的问题。你能通过回答自己的问题来发布你的解决方法吗? - rassar
你们有没有找到这个问题的解决方案?这种情况总是发生吗?我将我的导航控制器放在分割视图控制器中,这可能是罪魁祸首吗? - Arjen Hiemstra
3个回答

6
我遇到了相同的问题,这个方法对我有效。
    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        navigationItem.largeTitleDisplayMode = .always
        coordinator.animate(alongsideTransition: { (_) in
            self.coordinator?.navigationController.navigationBar.sizeToFit()
        }, completion: nil)
    }

简要解释一下这个。 - mentallurg
当然,因为我将我的navigationItem设置为always largeTitleDisplayMode,所以它会尝试通过sizeToFit()在方向更改时设置大标题。我为我的VC使用协调器模式,因此有了self.coordinator?,但是navigationBar上的sizeToFit应该重新调整navigationBar以显示大标题(如果可以的话)。 - Umar
@Umar 当我们使用 sizeToFit 时,无法保留滚动位置。 - Vignesh Kumar

0

iOS 16

首先在ViewDidLoad()或者Storyboard中的NavigationBar上将PrefersLargeTitles设置为true。

然后在导航控制器的rootController上添加以下内容:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)
    
    coordinator.animate { (_) in
        self.navigationController?.navigationBar.sizeToFit()
    }
}

0

一种方法是保存最大导航栏高度,并在旋转期间设置它。

就像这样:


var maximumHeight: CGFloat = 0

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {

        super.viewWillTransition(to: size, with: coordinator)

        guard let navigationController = navigationController else {
            return
        }

        if maximumHeight < navigationController.navigationBar.frame.height {
            maximumHeight = navigationController.navigationBar.frame.height
        }

        coordinator.animate(alongsideTransition: { (_) in

            navigationController.navigationBar.frame.size.height = self.maximumHeight

        }, completion: nil)
}


在横屏模式下,系统会自动调整大小,因此您不必担心它。@rassar @twofish

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