iOS_适配 iOS16 转屏

这篇具有很好参考价值的文章主要介绍了iOS_适配 iOS16 转屏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

iOS_适配 iOS16 转屏

  • 问题1:iOS 16 屏幕旋转报错:[Orientation] BUG IN CLIENT OF UIKIT: Setting UIDevice.orientation is not supported. Please use UIWindowScene.requestGeometryUpdate(_:)
    解决:iOS16 UIDevice 不再支持 setValue 方法,使用 UIWindowScenerequestGeometryUpdate() 的方法代替

  • 问题2: Xcode13Xcode14 编译出的安装包效果不一致
    解决:需要区分编译环境,写两套代码

  • 问题3:- (BOOL)shouldAutorotate{} 在iOS 16 已经不起作用了,无论返回 yes or no 都能转屏。
    解决:iOS16 新增:setNeedsUpdateOfSupportedInterfaceOrientations方法,用于通知 UIViewController 支持的屏幕方向有更新。在修改完 - (UIInterfaceOrientationMask)supportedInterfaceOrientations方法后调用

  • 问题4:iOS 16 转屏后立即获取的设备方向不正确:[UIDevice currentDevice].orientation 返回 UIDeviceOrientationUnknown
    解决:延迟回调 complete 后获取


Codes:

NSString *MODeviceOrientationDescription(UIDeviceOrientation orientation) {
    switch (orientation) {
        case UIDeviceOrientationUnknown: return @"Unknown";
        case UIDeviceOrientationPortrait: return @"Portrait";
        case UIDeviceOrientationPortraitUpsideDown: return @"PortraitUpsideDown";
        case UIDeviceOrientationLandscapeLeft: return @"LandscapeLeft";
        case UIDeviceOrientationLandscapeRight: return @"LandscapeRight";
        case UIDeviceOrientationFaceUp: return @"FaceUp";
        case UIDeviceOrientationFaceDown: return @"FaceDown";
    }
}

NSString *MOInterfaceOrientationDescription(UIInterfaceOrientation orientation) {
    switch (orientation) {
        case UIInterfaceOrientationUnknown: return @"Unknown";
        case UIInterfaceOrientationPortrait: return @"Portrait";
        case UIInterfaceOrientationPortraitUpsideDown: return @"PortraitUpsideDown";
        case UIInterfaceOrientationLandscapeLeft: return @"LandscapeLeft";
        case UIInterfaceOrientationLandscapeRight: return @"LandscapeRight";
    }
}

typedef void(^MODeviceOrientationCompletion)(NSError * _Nullable error);

void MOGeometryUpdate(UIViewController *viewController,
                      UIDeviceOrientation orientation,
                      MODeviceOrientationCompletion completion) {
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 160000
    /* Preprocess macro for compiling on Xcode14 */
    if (@available(iOS 16.0, *)) {
        if (![viewController respondsToSelector:@selector(setNeedsUpdateOfSupportedInterfaceOrientations)]) {
            NSString *errMsg = @"viewController can't respond setNeedsUpdateOfSupportedInterfaceOrientations";
            if (completion) {
                completion([NSError errorWithDomain:@"MODemo" code:0 userInfo:@{NSLocalizedDescriptionKey: errMsg}]);
            }
            return;
        }
        [viewController setNeedsUpdateOfSupportedInterfaceOrientations];
        [viewController.navigationController setNeedsUpdateOfSupportedInterfaceOrientations];
        
        // find scene
        NSArray<UIScene *> *scenes = [[[UIApplication sharedApplication] connectedScenes] allObjects];
        __block UIScene *firstScene = scenes.firstObject;
        [scenes enumerateObjectsUsingBlock:^(UIScene * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            // 转屏需要使用 role = UIWindowSceneSessionRoleApplication 的Scene,当取到其他Scene时,会转屏失败
            if ([obj.session.role isEqualToString:UIWindowSceneSessionRoleApplication]) {
                firstScene = obj;
                *stop = YES;
            }
        }];
        if (![firstScene isKindOfClass:[UIWindowScene class]]) {
            NSString *errMsg = [NSString stringWithFormat:@"Unexpected first scene, scenes: %@", scenes];
            if (completion) {
                completion([NSError errorWithDomain:@"MODemo" code:0 userInfo:@{NSLocalizedDescriptionKey: errMsg}]);
            }
            return;
        }
        UIWindowScene *windowScene = (UIWindowScene *)firstScene;
        UIInterfaceOrientationMask mask = 1 << orientation;
        UIWindowSceneGeometryPreferencesIOS *preferences = [[UIWindowSceneGeometryPreferencesIOS alloc] initWithInterfaceOrientations:mask];
        __block NSError *err = nil;
        [windowScene requestGeometryUpdateWithPreferences:preferences errorHandler:^(NSError * _Nonnull error) {
            NSString *errMsg = [NSString stringWithFormat:@"request geometry error: %@", error];
            err = [NSError errorWithDomain:@"MODemo" code:0 userInfo:@{NSLocalizedDescriptionKey: errMsg}];
            if (completion) {
                completion(error);
            }
        }];
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            if (completion) {
                completion(err);
            }
        });
    } else {
        [[UIDevice currentDevice] setValue:@(orientation) forKey:@"orientation"];
        [UIViewController attemptRotationToDeviceOrientation];
        if (completion) {
            completion(nil);
        }
    }
#else
    /* Preprocess macro for compiling on Xcode13 */
    [[UIDevice currentDevice] setValue:@(orientation) forKey:@"orientation"];
    [UIViewController attemptRotationToDeviceOrientation];
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        if (completion) {
            completion(nil);
        }
    });
#endif
}

github Demo


Reference:
Apple Developer Document
iOS 16适配屏幕旋转强制转屏切换大总结文章来源地址https://www.toymoban.com/news/detail-575532.html

到了这里,关于iOS_适配 iOS16 转屏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • iOS16灵动岛横屏视频播放适配(ZFPlayer)

    手机为iphone14Pro 版本iOS16.0.3 Xcode版本14.2 视频播放第三方库ZFPlayer 使用视频时,视频播放自动横屏控制层的返回按钮和暂停按钮都点不到,上图错误、下图正确(控制按钮距离屏幕左右减小50、视频全屏不做改变) 全屏没有考虑灵动岛的范围 ,这里在屏幕旋转时重置控制层

    2023年04月08日
    浏览(24)
  • SwiftUI适配iOS16导航控制器引起的闪退

    当时iPhone14系列手机升级到iOS16.5.1系统以后,当用户登录后再次退出登录闪退货登录后退出登录闪退。 由于SwiftUI提倡用struct代替类,导致悲剧产生,闪退时无法打印是那个结构体(class类实现时会打印类名),因为是struct也没有deinit跟踪内存是否泄漏。开启僵尸进程打印只有

    2024年02月11日
    浏览(46)
  • SPF9139全力适配ios16与鸿蒙3.0,超实用数据提取、分析、恢复能力UP!

    ​ 如今,群聊已成为人们必不可少的沟通窗口 家人群,好友群,班级群 粉丝群,交友群,工作群 …… 各类群聊铺天盖地般涌来的同时 也有一些群聊沦为了 赌博、传播淫秽视频 、发表不当言论 等违法犯罪行为滋生之地 与此同时 嫌疑人手机中的群消息往往十分琐碎繁杂 办

    2024年02月13日
    浏览(31)
  • MacOS 14 系统 XCode15、 Flutter 开发 IOS

    MacOS14 Sonoma 安装 Flutter 开发环境 MacOS 系统 Flutter开发Android 环境配置 MacOS 系统 Flutter开发IOS 环境配置​​​​​​​ 前面我们已经在MacOS14 M3芯片上安装好 Flutter环境,包括开发工具 VsCode 、Android Stuiod,那么flutter如何开发IOS呢? 我们知道IOS开发语言为 objcet-c或者 swift,Flutter是

    2024年02月03日
    浏览(54)
  • iOS 16.4后 Safari 开发中不能调试Web页面

    项目中有WKWebView, iPhone和模拟器 升级到16.4后 不能使用Safari 调试? 以前挺好的为啥现在不行了? 这时候有两个方案, 第一, 使用低版本模拟器 16.2 16.0 等都可以. 第二, 设置 inspectable (OC), isInspectable (Swift) ---------------------- 官方文档 isInspectable | Apple Developer Documentation 简单的说,在

    2024年02月15日
    浏览(39)
  • iOS16系统手机设置开启开发者模式才能安装ipa包

    在 iOS 16 以后的苹果系统对安全操作有更进一步的要求, 在安装 adhoc 类型的 ipa 包完毕后, 点击对应的 app 时, 用户会发现如下提示: 此时需要您打开 iOS 中新增的开发者模式, 具体打开方式如下: 进入 “设置” - “隐私与安全性” - 下滑到最底部, 在\\\"安全性\\\"里找到 “

    2024年02月13日
    浏览(33)
  • 如何在 macOS 上同时使用 Flutter2 和 Flutter3 进行 ios 开发

    猫哥主打系统环境是: macos flutter 3.7.12 ruby 3.2.2 cocoapods 1.12.1 xcode 14.3.1 这套配置运行最新的项目没问题,但是最近需要维护 flutter 2.10.5 这种老项目,虽然用了 fvm 进行 flutter 版本切换,但是 flutter 2.10.5 用的 ruby 2 ,我当前是 ruby 3 所以运行 pod install 的时候就报错了。 这个错误

    2024年02月12日
    浏览(39)
  • 基于.Net开发的ChatGPT客户端,兼容Windows、IOS、安卓、MacOS、Linux

    2023年目前要说最热的点,肯定是ChatGPT了。 ChatGPT官方提供的网页版本,还有需要科*上网,很多人都会基于此进行封装。 现在是移动互联网时代,基于手机APP的需求还是很大的。 所以,今天给大家推荐一个ChatGPT客户端开源项目,兼容苹果和安卓手机、PC。 这是基于C#开发的客

    2023年04月20日
    浏览(32)
  • Objective-C网络请求开发的高效实现方法与技巧

    在移动应用开发中,网络请求是一项至关重要的技术。Objective-C作为iOS平台的主要开发语言之一,拥有丰富的网络请求开发工具和技术。本文将介绍如何利用Objective-C语言实现高效的网络请求,以及一些实用的技巧和方法。 Objective-C是一种基于C语言的面向对象编程语言,它具

    2024年04月14日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包