iOS 11设置prefersLargeTitles与Headline导航栏返回动画不流畅问题咨询
解决iOS 11下prefersLargeTitles切换导致返回动画不流畅的问题
我之前踩过一模一样的坑!你遇到的动画卡顿问题,核心原因是修改prefersLargeTitles的时机不对——在详情页的viewDidLoad里调整导航栏属性,会打乱系统自带的过渡动画逻辑,自然就没法呈现像系统设置页面那样流畅的缩放动画了。
问题根源
系统设置页面的流畅动画,是因为Apple在设计API时,预期开发者在页面即将出现的生命周期钩子(也就是viewWillAppear)里调整导航栏的大标题属性,这样系统能同步把属性变化和页面过渡动画绑定,生成连贯的缩放效果。而你在viewDidLoad里修改时,视图还没进入过渡准备阶段,系统没法把这个变化纳入动画流程,导致动画断裂。
修复方案
只需要调整代码的位置,让两个页面的prefersLargeTitles设置都在viewWillAppear中完成:
- 首页代码保持不变:
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.navigationController?.navigationBar.prefersLargeTitles = true }
- 修改详情页的设置时机:
把原来在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 }
- 额外优化:匹配largeTitleDisplayMode
如果想让动画完全和系统设置页一致,建议给两个页面的导航项设置对应的largeTitleDisplayMode:
// 首页viewDidLoad中添加 navigationItem.largeTitleDisplayMode = .always // 详情页viewDidLoad中添加 navigationItem.largeTitleDisplayMode = .never
这样修改后,系统会自动识别前后页面的导航栏属性变化,生成和系统设置页一样的流畅缩放返回动画啦!
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

