xcode 26 适配

罗列一些我这边的适配点,慢慢补充

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);
        }];
    }

未完待续...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 最近公司的很多流量产品需要适配iOS 11 和iPhone X,由于公司的iPhone X到的比较晚,拖了好...
    花了个缺阅读 867评论 0 2
  • Table of Contents iOS11 适配一、Large Title View二、导航栏1. 图层变化2...
    Vinc阅读 1,819评论 1 5
  • 1.自定义控件 a.继承某个控件 b.重写initWithFrame方法可以设置一些它的属性 c.在layouts...
    圍繞的城阅读 3,688评论 2 4
  • 一、定位失效 苹果新增加了一项NSLocationAlwaysAndWhenInUseUsageDescripti...
    冷武橘阅读 472评论 0 0
  • 什么是 UIViewController UIViewController: 使用数据( Model )来构造视图...
    WesleyLien阅读 1,229评论 1 2

友情链接更多精彩内容