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中的导航栏确实是一个让人困惑的知识点,我开始也是在项目预定的框架下去设置导航栏的一些属性,直...
    myzhing阅读 404评论 0 1
  • 对于iOS 开发者来说,导航栏确实是一个让人困惑的知识点。比如设置导航栏透明效果,透明导航栏与非透明导航栏之间的跳...
    whbsspu阅读 846评论 0 3
  • IOS开发之UINavigationController详解 http://www.open-open.com/l...
    Kevin_Junbaozi阅读 4,069评论 0 2
  • 1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现cl...
    以德扶人阅读 2,430评论 2 50
  • 1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现cl...
    小小东阅读 1,072评论 2 10