本文只涉及 iOS 16 Beta中出现的导航栏异常
我们一般配置自定义导航栏会用到 navigationItem.titleView,在iOS 16 Bata的适配过程中发现导航栏的自定义titleView会出现位置、尺寸、透明度配置异常。
1. navigationItem.titleView 位置异常问题
1.1 查看导航栏层级
image.png根据层级显示,在iOS 16 Beta
中 新增了一个私有类 _UINavigationBarTitleControl
,它将我们提供的自定义titleView
进行了包裹。
UI展示异常的titleView
其父层级的_UINavigationBarTitleControl
有约束异常的提示,说明_UINavigationBarTitleControl
是通过子视图获取尺寸进行的约束。
检查业务代码发现,在自定义titileView
初始化时已经传入了frame
,所以猜测是_UINavigationBarTitleControl
获取子视图尺寸异常引起的问题
1.2 处理方案
既然是系统autolayout的异常,那我们就声明一下我们期望的尺寸。
在自定义titleView的实现中重写 intrinsicContentSize
方法,它会向系统声明我们期望的尺寸
- (CGSize)intrinsicContentSize {
return UILayoutFittingExpandedSize; // 表示在可用范围内尽可能给予最大可用尺寸
}
2. navigationItem.titleView alpha失效问题
iOS 16 Beta
中navigationItem.titleView.alpha
设置无效
尝试了各种方式设置透明度,均不生效,最后猜测是_UINavigationBarTitleControl
的一级子视图不能设置透明度
遂只给titleView套了一个容器,测试设置alpha生效
self.titleView.frame = CGRectMake(0, 0, width, height);
if (@available(iOS 16.0, *)) {
UIView *titleViewBG = [[UIView alloc] initWithFrame:CGRectMake(0, 0, width, height)];
[titleViewBG addSubview:self.titleView];
self.navigationItem.titleView = titleViewBG;
}
else {
self.navigationItem.titleView = self.titleView;
}
......
......
self.titleView.alpha = xxxxx; // 透明度生效
网友评论