罗列一些我这边的适配点,慢慢补充
flutter 兼容异常崩溃
## mprotect error: 13 (Permission denied
全局配置
<key>UIDesignRequiresCompatibility</key> <true/>
经过验证,info.plist中如果增加了上述的配置后,导航栏以及自定义tabbar的问题的问题都可以修复
后期导航栏、tabbar还是要去适配的:
导航栏
iOS26 给所有的UIBarButtonItem都增加了一个白色背景,如果只有一个按钮,那就是圆底白色背景,多个呢会撑开
翻看了iOS26 UIBarButtonItemapi,有两个新增的属性
hidesSharedBackground
sharesBackground
尝试了一下,白色背景果然去掉了,设置如下:
if(@available(iOS 26.0, *)) {
item.hidesSharedBackground = YES;
item.sharesBackground = NO;
}
为了不全局改,那么hook掉系统设置UINavigationItem的几个方法
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// ========== Hook setLeftBarButtonItem: ==========
[self swizzleSelector:@selector(setLeftBarButtonItem:)
withNewSelector:@selector(customSetLeftBarButtonItem:)];
// ========== Hook setRightBarButtonItem: ==========
[self swizzleSelector:@selector(setRightBarButtonItem:)
withNewSelector:@selector(customSetRightBarButtonItem:)];
// 兼容带动画的版本(避免漏拦截)
[self swizzleSelector:@selector(setLeftBarButtonItem:animated:)
withNewSelector:@selector(customSetLeftBarButtonItem:animated:)];
[self swizzleSelector:@selector(setRightBarButtonItem:animated:)
withNewSelector:@selector(customSetRightBarButtonItem:animated:)];
// 兼容数组版本(leftBarButtonItems/rightBarButtonItems)
[self swizzleSelector:@selector(setLeftBarButtonItems:)
withNewSelector:@selector(customSetLeftBarButtonItems:)];
[self swizzleSelector:@selector(setRightBarButtonItems:)
withNewSelector:@selector(customSetRightBarButtonItems:)];
});
}
效果好了一些,但是过渡还是不够自然
右侧rightBarButtonItem
设置右侧rightBarButtonItem的时候,xcode26运行时,默认回给右侧加一个间距,如果想消掉这个间距,加个fixView。另外不能约束以及frame一起布局,否色会被撑开
UIView *rightFixView = [[UIView alloc] init];
rightFixView.frame = CGRectMake(0, 0, 44, 44);
if ([Util isXcode26OrLater]) {
rightFixView.frame = CGRectMake(12, 0, 44, 44);
}
[rightView addSubview:rightFixView];
UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:rightView];
关于iOS26废弃delegate.window采用sceneDelegate去初始化窗口
项目中使用到一个debug调试的库,拉了分支,做了适配
https://github.com/LxManMan0807/LLDebugTool/tree/fix_sceneWindow
关于sceneDelegate初始化的窗口横竖屏适配
之前是不需要设置支持横屏的,现在是都要设置了
if (@available(iOS 16.0, *)) {
UIInterfaceOrientationMask orieMask = [self convertInterfaceOrientation:self.orientation];
UIViewController *currentVC = [self getCurrentViewController];
if (!currentVC) return;
UINavigationController *nav = currentVC.navigationController;
UIViewController *targetVC = nav ?: currentVC;
[targetVC setNeedsUpdateOfSupportedInterfaceOrientations];
UIWindowScene *windowScene = (UIWindowScene *)currentVC.view.window.windowScene;
if (!windowScene) return;
UIWindowSceneGeometryPreferencesIOS *preferences = [[UIWindowSceneGeometryPreferencesIOS alloc]initWithInterfaceOrientations:orieMask];
[windowScene requestGeometryUpdateWithPreferences:preferences errorHandler:^(NSError * _Nonnull error) {
NSLog(@"%@",error);
}];
}
未完待续...