iOS 横竖屏切换--强制/非强制

iOS实现横竖屏切换,需注意两种情况,即强制/非强制,否则容易造成代码无法实现预计切换效果。

1、横竖屏切换情况:

TARGETS->General->Device Orientation

1.1、上图红框中 Left,Right 勾选,表示APP支持横屏,属于非强制横竖屏切换情况

1.2、上图红框中 Left,Right 都不勾选,表示APP不支持横屏,属于强制横竖屏切换情况

备注:后述中代码中"isPortrait"变量用于记录横/竖屏状态

2、横竖屏转换实现,有两种方法:

2.1、KVC实现

if isPortrait {
            //切换到横屏
            UIDevice.current.setValue(NSNumber(integerLiteral: UIInterfaceOrientation.landscapeLeft.rawValue), forKey: "orientation")
            isPortrait = false
        } else {
            //切换到竖屏
            UIDevice.current.setValue(NSNumber(integerLiteral: UIInterfaceOrientation.portrait.rawValue), forKey: "orientation")
            isPortrait = true
        }

2.2、NSInvocation实现

#import <UIKit/UIKit.h>

@interface DeviceOrientationTool : NSObject

+ (void)interfaceOrientation:(UIInterfaceOrientation)orientation;

@end

#import "DeviceOrientationTool.h"

@implementation DeviceOrientationTool

+ (void)interfaceOrientation:(UIInterfaceOrientation)orientation {
    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 = (int)orientation;
        [invocation setArgument:&val atIndex:2];
        [invocation invoke];
    }
}

@end
if AppDelegate.isPortrait {
            //切换到横屏
            AppDelegate.isPortrait = false
            DeviceOrientationTool.interfaceOrientation(.landscapeLeft)
        } else {
            //切换到竖屏
            AppDelegate.isPortrait = true
            DeviceOrientationTool.interfaceOrientation(.portrait)
        }

3、强制/非强制横竖屏切换

3.1、非强制横竖屏切换

结合2.1部分代码,并在相关VC中复写如下属性即可(如果需要支持自转)

override var shouldAutorotate: Bool {
        return true
    }

3.2、强制横竖屏切换

结合2.2部分代码,并在AppDelete中实现如下方法即可

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
        if AppDelegate.isPortrait {
            return [.portrait]
        }
        return [.portrait, .landscapeLeft, .landscapeRight]
    }

备注:3.1和3.2可使用2.1或2.2部分代码

4、监听屏幕方向变化

NotificationCenter.default.addObserver(self, selector: #selector(orientationChangedNotification(_:)), name: UIDevice.orientationDidChangeNotification, object: UIDevice.current)

@objc func orientationChangedNotification(_ sender: Notification) {
        let orientation = UIApplication.shared.statusBarOrientation
        switch orientation {
        case .landscapeLeft:
            print("屏幕向左")
        case .landscapeRight:
            print("屏幕向右")
        case .portrait:
            print("屏幕向上")
        case .portraitUpsideDown:
            print("屏幕向下")
        default:
            print("未知方向")
        }
    }

5、iOS13及以上系统,在横屏状态下状态栏会消失

如果仍需显示状态栏,可参考类似思路:iOS13关于状态栏在横屏模式下隐藏的解决办法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值