You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS 11设置prefersLargeTitles与Headline导航栏返回动画不流畅问题咨询

解决iOS 11下prefersLargeTitles切换导致返回动画不流畅的问题

我之前踩过一模一样的坑!你遇到的动画卡顿问题,核心原因是修改prefersLargeTitles的时机不对——在详情页的viewDidLoad里调整导航栏属性,会打乱系统自带的过渡动画逻辑,自然就没法呈现像系统设置页面那样流畅的缩放动画了。

问题根源

系统设置页面的流畅动画,是因为Apple在设计API时,预期开发者在页面即将出现的生命周期钩子(也就是viewWillAppear)里调整导航栏的大标题属性,这样系统能同步把属性变化和页面过渡动画绑定,生成连贯的缩放效果。而你在viewDidLoad里修改时,视图还没进入过渡准备阶段,系统没法把这个变化纳入动画流程,导致动画断裂。

修复方案

只需要调整代码的位置,让两个页面的prefersLargeTitles设置都在viewWillAppear中完成:

  1. 首页代码保持不变:
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.prefersLargeTitles = true
}
  1. 修改详情页的设置时机:
    把原来在viewDidLoad里的prefersLargeTitles设置,移到viewWillAppear中:
override func viewDidLoad() {
    super.viewDidLoad()
    self.title = "Detail"
    view.backgroundColor = #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
    // 这里移除prefersLargeTitles的设置
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.prefersLargeTitles = false
}
  1. 额外优化:匹配largeTitleDisplayMode
    如果想让动画完全和系统设置页一致,建议给两个页面的导航项设置对应的largeTitleDisplayMode:
// 首页viewDidLoad中添加
navigationItem.largeTitleDisplayMode = .always

// 详情页viewDidLoad中添加
navigationItem.largeTitleDisplayMode = .never

这样修改后,系统会自动识别前后页面的导航栏属性变化,生成和系统设置页一样的流畅缩放返回动画啦!

内容的提问来源于stack exchange,提问作者Tim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:01:21