从iOS11 开始系统风格变成了“贼大”的导航栏标题样式就不展示了 系统app里都有 设置方式可以分为全局设置或者单个页面设置
1.全局设置
[[UINavigationBar appearance] setPrefersLargeTitles:YES];
2.单个页面设置(在viewWillAppear中设置)
if (@available(iOS 11.0, *)) {
self.navigationController.navigationBar.prefersLargeTitles = YES;
self.navigationController.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeAutomatic;
} else {
// Fallback on earlier versions
}
largeTitleDisplayMode
typedef NS_ENUM(NSInteger, UINavigationItemLargeTitleDisplayMode) {
/// 自动显示大标题或小标题(初始时是大标题,当滑动使大标题隐藏时显示小标题)
UINavigationItemLargeTitleDisplayModeAutomatic,
/// 总是显示大标题
UINavigationItemLargeTitleDisplayModeAlways,
/// 是总是显示小标题
UINavigationItemLargeTitleDisplayModeNever,
} NS_SWIFT_NAME(UINavigationItem.LargeTitleDisplayMode);
有这三种类型只有当设置prefersLargeTitles
为true
是设置的展示方式属性才会生效,当使用大标题的时候大多数使用的都是UINavigationItemLargeTitleDisplayModeAutomatic
说了这么多现在开始列举遇到的问题
1. 之前好用的present
出来的带着导航栏的控制器当dismiss
后程序莫名其妙的崩溃
这个目前出现这种情况的原因展示不明确,解决方案如果你前一个页面使用了大标题present
的页面还需要带着导航栏只需要在present
时候加下面两行代码
//这里的vc是需要模态出来的控制器
UINavigationController * nav = [[UINavigationController alloc] initWithRootViewController:vc];
if (@available(iOS 11.0, *)) {
nav.navigationBar.prefersLargeTitles = NO;
nav.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeNever;
} else {
// Fallback on earlier versions
}
[self presentViewController:nav animated:NO completion:nil];
2.当前页面存在UITableView
或者UICollectionView
当下拉或者做上拉的时候大标题的导航栏会闪烁
先看看效果对比
很明显不正常的显示在下拉的过程中会出现抖动的情况(对比一下系统的发现的)不废话有可能导致的原因
[UINavigationBar appearance].translucent = NO;
如果是这个发现当用大标题的时候重新赋值为yes 布局也一切正常
if (@available(iOS 11.0, *)) {
collectionView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
}
当时为了适配iOS 11 添加的代码当时记得好像是会有黑边,也是直接注释掉就可以了