iOS 16 导航栏titleView适配 _UINavigationBarTitleControl

本文只涉及 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是通过子视图获取尺寸进行的约束。

image.png

检查业务代码发现,在自定义titileView初始化时已经传入了frame,所以猜测是_UINavigationBarTitleControl获取子视图尺寸异常引起的问题

1.2 处理方案

既然是系统autolayout的异常,那我们就声明一下我们期望的尺寸。
在自定义titleView的实现中重写 intrinsicContentSize 方法,它会向系统声明我们期望的尺寸

- (CGSize)intrinsicContentSize {
    return UILayoutFittingExpandedSize; // 表示在可用范围内尽可能给予最大可用尺寸
}

2. navigationItem.titleView alpha失效问题

iOS 16 BetanavigationItem.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; // 透明度生效

你可能感兴趣的:(iOS 16 导航栏titleView适配 _UINavigationBarTitleControl)