Navigation Bar大标题push新View Controller时动画异常如何解决?
问题根源
你错误地在每个控制器的viewWillAppear生命周期中直接修改导航栏的prefersLargeTitles属性,这个修改时机晚于push动画的过渡状态计算阶段,导致系统无法正确渲染导航栏的切换动画,就会出现大标题残留、返回按钮不显示的异常。
修复步骤
- 第一步:全局仅设置一次导航控制器的
prefersLargeTitles属性即可,不需要每个子控制器反复修改。你可以在导航控制器初始化时设置,或者在主视图控制器的viewDidLoad中添加一次:
navigationController?.navigationBar.prefersLargeTitles = true
- 第二步:修改主视图控制器代码,删除
viewWillAppear中修改prefersLargeTitles的逻辑,在viewDidLoad中为当前控制器单独指定大标题显示模式:
// 主控制器viewDidLoad中添加 navigationItem.largeTitleDisplayMode = .always
修改后的主控制器viewWillAppear可以直接删除原有逻辑,如果你没有其他操作的话可以直接移除这个方法。
- 第三步:修改目标控制器AddUser的代码,删除
viewWillAppear中修改prefersLargeTitles的逻辑,在viewDidLoad中为当前控制器单独指定大标题显示模式:
// AddUser的viewDidLoad中添加 navigationItem.largeTitleDisplayMode = .never
补充说明
navigationItem.largeTitleDisplayMode是每个控制器独有的配置项,系统会在push/pop的时候自动根据前后两个控制器的该属性值计算过渡动画,不会出现状态冲突。直接修改全局的导航栏prefersLargeTitles会打断正在进行的切换动画,是官方不推荐的写法。
内容的提问来源于stack exchange,提问作者ARES
相关产品推荐
相关产品推荐

