iOS 16横竖屏切换适配

本文提供了iOS应用中实现屏幕横竖屏切换的方法,包括Objective-C和Swift两种版本的代码示例,并展示了如何获取当前屏幕的方向。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

切换横竖屏

oc版本
/// 旋转屏幕
/// - Parameters:
///   - interfaceOrientation: 目标屏幕方向
///   - viewController: 所在的视图控制器
///   - errorHandler: 错误回调
+ (void)rotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation viewController:(UIViewController *)viewController errorHandler:(void (^)(NSError *))errorHandler {
#if __IPHONE_16_0 //兼容 Xcode13
    if (@available(iOS 16.0, *)) {
        UIWindowScene *windowScene = viewController.view.window.windowScene;
        if (!windowScene) {
            return;
        }
        [viewController setNeedsUpdateOfSupportedInterfaceOrientations];
        UIWindowSceneGeometryPreferencesIOS *geometryPreferences = [[UIWindowSceneGeometryPreferencesIOS alloc] init];
        switch (interfaceOrientation) {
            case UIInterfaceOrientationPortrait:
                geometryPreferences.interfaceOrientations = UIInterfaceOrientationMaskPortrait;
                break;
            case UIInterfaceOrientationPortraitUpsideDown:
                geometryPreferences.interfaceOrientations = UIInterfaceOrientationMaskPortraitUpsideDown;
                break;
            case UIInterfaceOrientationLandscapeLeft:
                geometryPreferences.interfaceOrientations = UIInterfaceOrientationMaskLandscapeLeft;
                break;
            case UIInterfaceOrientationLandscapeRight:
                geometryPreferences.interfaceOrientations = UIInterfaceOrientationMaskLandscapeRight;
                break;
            default:
                break;
        }
        [windowScene requestGeometryUpdateWithPreferences:geometryPreferences errorHandler:^(NSError * _Nonnull error) {
            //业务代码
            NSLog(@"menglc errorHandler error %@", error);
            if (errorHandler) {
                errorHandler(error);
            }
        }];
        return;
    }
#endif
    if([[UIDevice currentDevice]respondsToSelector:@selector(setOrientation:)]) {
        SEL selector = NSSelectorFromString(@"setOrientation:");
        NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];
        [invocation setSelector:selector];
        [invocation setTarget:[UIDevice currentDevice]];
        int val = UIInterfaceOrientationLandscapeRight;//横屏UIInterfaceOrientationPortrait
        [invocation setArgument:&val atIndex:2];
        [invocation invoke];
    }
}
Swift版本
/// 切换横竖屏
    public static func rotate(to toInterfaceOrientation: UIInterfaceOrientation, viewController:UIViewController) {
#if __IPHONE_16_0 //兼容 Xcode13
        if #available(iOS 16, *) {
            guard let windowScene = viewController.view.window?.windowScene else {
                return
            }
            viewController.setNeedsUpdateOfSupportedInterfaceOrientations()
            let interfaceOrientation: UIInterfaceOrientationMask
            switch toInterfaceOrientation {
            case .unknown, .portrait:
                interfaceOrientation = .portrait
            case .portraitUpsideDown:
                interfaceOrientation = .portraitUpsideDown
            case .landscapeLeft:
                interfaceOrientation = .landscapeLeft
            case .landscapeRight:
                interfaceOrientation = .landscapeRight
            @unknown default:
                interfaceOrientation = .portrait
            }
            let geometryPreferences = UIWindowScene.GeometryPreferences.iOS(interfaceOrientations: interfaceOrientation)
            windowScene.requestGeometryUpdate(geometryPreferences) { error in
                
            }
            return
        }
#endif
        guard let selector = Selector(("setOrientation")) as Selector?, UIDevice.current.responds(to: selector), let methodSignature = UIDevice.instanceMethod(for: selector) else {
            return
        }
        // todo
    }

获取当前屏幕横竖屏状态

oc版本
+ (UIInterfaceOrientation)interfaceOrientation {// 获取当前屏幕横竖屏状态
    if (@available(iOS 13.0, *)) {
        return [UIApplication sharedApplication].windows.firstObject.windowScene.interfaceOrientation;
    }
    return [[UIApplication sharedApplication] statusBarOrientation];
}
Swift版本
/// 获取当前屏幕横竖屏状态
public class func interfaceOrientation() -> UIInterfaceOrientation {
        guard #available(iOS 13, *) else {
            return UIApplication.shared.statusBarOrientation
        }
        return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation ?? .unknown
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值