iOS 26 适配问题记录

概述

本文档记录在 iOS 26 适配过程中遇到的具体问题和解决方案,主要关注实际开发中的兼容性问题而非新功能介绍。

1. 临时关闭液态玻璃效果

问题描述

iOS 26 默认开启 Liquid Glass(液态玻璃)效果,在 UINavigationBar 和 UITabBar 等组件上强制应用。

临时解决方案

Info.plist中添加:

<key>UIDesignRequiresCompatibility</key>
<true/>

这样会直接关闭毛玻璃效果,项目在iOS26上会显示原来的样子,如果项目有bug,到这里就先赶紧上架吧!后面再适配iOS26

注意事项

  • 此为临时方案,苹果限制最多使用一年

  • 下个主要版本将移除此属性

  • 应尽快完成正式适配

2. 导航栏相关问题

2.1 导航栏按钮玻璃背景问题

问题现象

  • 导航栏按钮出现大圆角矩形玻璃背景

  • 按钮文字被遮挡

  • 图标偏移显示异常

  • 之前设置的偏移量失效

解决方案

// 方法1: 重新设计图标,使用居中对齐的图标
// 方法2: 调整customView的布局约束

2.2 自定义View添加到NavigationBar的问题

问题代码

// 页面出现时添加
[self.navigationController.navigationBar addSubview:_naviView];

// 页面消失时移除
[_naviView removeFromSuperview];

 

问题现象

从二级页面返回后view消失(图层中存在但不可见)

根本原因分析

iOS版本

导航栏变化

影响

iOS 15

引入 UINavigationBarAppearance

改变背景和阴影绘制机制

iOS 17+

导航栏层级变动,_UINavigationBarModernContentView 延迟加载

手动添加的子视图可能被系统布局或动画移除

iOS 26

NavigationBar使用新的compositing layer结构

非官方子视图在appear/disappear动画时被遮盖

解决方案

方案1:添加到titleView(不推荐)

[self.navigationController.navigationItem.titleView addSubview:_naviView];
  • 优点:自动管理生命周期

  • 缺点:布局受限

方案2:添加到NavigationBar的superview层(推荐)

[self.navigationController.view addSubview:_naviView];
  • 优点:布局灵活,不受导航栏内部结构变动影响

  • 注意:需在二级页面viewWillAppear时隐藏

方案3:延迟加载

dispatch_async(dispatch_get_main_queue(), ^{
    [self.navigationController.view addSubview:_naviView];
});

 

3. TabBar相关问题

3.1 私有属性设置TabBar问题

不推荐的做法

[self setValue:self.customTabbar forKey:@"tabBar"];

问题后果

  • 运行时闪退

  • 新增单独tab

  • 自定义TabBar失效

3.2 直接添加SubView的方式

self.customTabbar.frame = self.tabBar.bounds;
[self.tabBar addSubview:self.customTabbar];

可能问题

  • 显示基本正常,有玻璃效果

  • 中间大按钮可能有问题

  • 点击可能失效(被系统拦截)

3.3 自定义TabBar适配建议

对于仿闲鱼样式的发布TabBar(四个tabbarItem + 中间发布图标),需要重新设计UI或等待第三方库更新。

3.4 TabBar透明度问题

if #unavailable(iOS 26) {
    tabBar.isTranslucent = false
}

4. 布局约束问题

问题描述

kTopHeight(NaviBarHeight + StatusBarHeight)获取不准确

原因分析

  • windowScene.statusBarManager.statusBarFrame在某些时机为0或未更新

  • safeAreaInsets在view布局完成后才精确计算

  • UINavigationBar在iOS 26中可能异步构建

解决方案

make.top.equalTo(self.view.mas_safeAreaLayoutGuideTop).offset(0);

5. 图片导航栏按钮显示蓝色问题

问题代码

- (void)setNavigationBarBtn {
    UIImage *addImg = [[UIImage imageNamed:@"规范_新增+"] 
                       imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    UIBarButtonItem *add = [[UIBarButtonItem alloc] initWithImage:addImg 
                                                            style:UIBarButtonItemStyleDone 
                                                           target:self 
                                                           action:@selector(addClient)];
    self.navigationItem.rightBarButtonItems = @[add];
}

解决方案

方案1:设置tintColor为clearColor(推荐)

- (void)setNavigationBarBtn {
    UIImage *addImg = [[UIImage imageNamed:@"规范_新增+"] 
                       imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    UIImage *searchImg = [[UIImage imageNamed:@"放大镜"] 
                          imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

    UIBarButtonItem *add = [[UIBarButtonItem alloc] initWithImage:addImg
                                                            style:UIBarButtonItemStylePlain
                                                           target:self
                                                           action:@selector(addClient)];

    UIBarButtonItem *search = [[UIBarButtonItem alloc] initWithImage:searchImg
                                                               style:UIBarButtonItemStylePlain
                                                              target:self
                                                              action:@selector(searchClient)];

    // ✅ iOS 26修复方案
    for (UIBarButtonItem *item in @[add, search]) {
        item.tintColor = UIColor.clearColor;
    }
    
    // ⚠️ 注意iOS 26中按钮顺序变化
    if (@available(iOS 26.0, *)) {
        self.navigationItem.rightBarButtonItems = @[search, add];
    } else {
        self.navigationItem.rightBarButtonItems = @[add, search];
    }
}

 

方案2:使用自定义UIButton

- (void)setNavigationBarBtn {
    UIButton *addButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [addButton setImage:[UIImage imageNamed:@"规范_新增+"] forState:UIControlStateNormal];
    addButton.frame = CGRectMake(0, 0, 30, 30);
    [addButton addTarget:self action:@selector(addClient) forControlEvents:UIControlEventTouchUpInside];
    
    UIBarButtonItem *add = [[UIBarButtonItem alloc] initWithCustomView:addButton];
    
    self.navigationItem.rightBarButtonItems = @[add];
}

 

重要提醒

iOS 26中导航栏按钮顺序发生变化,需要条件编译处理:

if (@available(iOS 26.0, *)) {
    // iOS 26: 数组第一个元素显示在最右边
    self.navigationItem.rightBarButtonItems = @[最右边的按钮, 中间按钮, 最左边的按钮];
} else {
    // iOS 25及以下: 数组第一个元素显示在最左边
    self.navigationItem.rightBarButtonItems = @[最左边的按钮, 中间按钮, 最右边的按钮];
}

 

更新记录

  • 文档将持续更新,遇到新的适配问题会及时补充   转自 https://www.cnblogs.com/weicyNo-1/p/19157486 

posted @ 2025-11-20 10:53  代码只是一种思想  阅读(160)  评论(0)    收藏  举报