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(不推荐)
-
优点:自动管理生命周期
-
缺点:布局受限
方案2:添加到NavigationBar的superview层(推荐)
[self.navigationController.view addSubview:_naviView];
-
优点:布局灵活,不受导航栏内部结构变动影响
-
注意:需在二级页面
viewWillAppear时隐藏
方案3:延迟加载
dispatch_async(dispatch_get_main_queue(), ^{
[self.navigationController.view addSubview:_naviView];
});
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

浙公网安备 33010602011771号