如何在同一控制器内实现点击按钮触发导航栏大标题转小标题动画
同一控制器内导航栏大小标题平滑切换实现方案
直接修改navigationItem.largeTitleDisplayMode没有动画是因为没有触发导航栏的布局更新,只需将属性修改和强制布局操作放在系统UIView动画闭包内即可实现平滑过渡效果。
实现代码
Swift 版本
// 点击按钮触发切换为小标题的动画 UIView.animate(withDuration: 0.3) { self.navigationItem.largeTitleDisplayMode = .never self.navigationController?.navigationBar.layoutIfNeeded() } // 如需恢复大标题,同理修改mode即可 UIView.animate(withDuration: 0.3) { self.navigationItem.largeTitleDisplayMode = .always self.navigationController?.navigationBar.layoutIfNeeded() }
Objective-C 版本
// 切换为小标题 [UIView animateWithDuration:0.3 animations:^{ self.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeNever; [self.navigationController.navigationBar layoutIfNeeded]; }]; // 恢复大标题 [UIView animateWithDuration:0.3 animations:^{ self.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeAlways; [self.navigationController.navigationBar layoutIfNeeded]; }];
注意事项
- 确保你的UINavigationController已经全局开启大标题支持,即已设置
navigationController?.navigationBar.prefersLargeTitles = true,否则切换操作无效 - 0.3秒是系统导航栏默认动画时长,和系统动效适配性最好,可根据需求自行调整时长
- 如果导航栏添加了自定义视图,需要同步在动画闭包内调整自定义视图的布局,避免出现跳变问题
内容的提问来源于stack exchange,提问作者Cong Phu
相关产品推荐
相关产品推荐

