1. UITabBarButtonItem 液态玻璃效果
兼容处理
第一种方式(不推荐):关闭所有 UITabBarButtonItem 的液态玻璃效果。
if (@available(iOS 16.0, *)) {
self.navigationItem.rightBarButtonItem.hidesSharedBackground = YES;
self.navigationItem.leftBarButtonItem.hidesSharedBackground = YES;
} else {
// Fallback on earlier versions
}
第二种方式:所有导航栏按钮全部采用 UITabBarButtonItem,支持液态玻璃效果。
第三种方式:降低 Xcode 版本到 Xcode 15 及以下版本,然后再打包。
第四种方式:使用兼容模式显示传统 UI 风格,取消 TabBar 液态玻璃效果。 打开 Info.plist,添加一个 Boolean 键值对,取消液态玻璃效果,添加完成后重新运行,UITabBar 恢复旧的样式:
<key>UIDesignRequiresCompatibility</key>
<true/>
2. UILayoutFittingExpandedSize 高度异常问题
在 iOS 16 之前,UILayoutFittingExpandedSize 最大尺寸限制在导航栏范围内。而在 iOS 16 则允许充斥整个屏幕,导致自定义 navigationItem.titleView 的高度变为屏幕高度,预期应为导航栏高度。
原因代码示例:
- (CGSize)intrinsicContentSize { return UILayoutFittingExpandedSize; }
兼容处理
修改 intrinsicContentSize,指定 titleView 的尺寸大小为导航栏大小:
#define SCREEN_WIDTH ([[UIScreen mainScreen] respondsToSelector:@selector(nativeBounds)] ? [UIScreen mainScreen].nativeBounds.size.width / [UIScreen mainScreen].nativeScale : [UIScreen mainScreen].bounds.size.width)
- (CGSize)intrinsicContentSize {
return CGSizeMake(SCREEN_WIDTH, 44);
}
3. UITabBarController KVC 注入失效
iOS 16 之后对 UITabBarController 的 KVC 注入限制,导致 self.setValue(yourTabBar, forKey: "tabBar") 自定义 tabBar 失效,但不会 crash。
兼容处理
方案 1:使用兼容模式显示传统 UI 风格,取消 TabBar 液态玻璃效果。 打开 Info.plist,添加 Boolean 键值对:
<key>UIDesignRequiresCompatibility</key>
<true/>

