切换横竖屏
oc版本
+ (void)rotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation viewController:(UIViewController *)viewController errorHandler:(void (^)(NSError *))errorHandler {
#if __IPHONE_16_0
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;
[invocation setArgument:&val atIndex:2];
[invocation invoke];
}
}
Swift版本
public static func rotate(to toInterfaceOrientation: UIInterfaceOrientation, viewController:UIViewController) {
#if __IPHONE_16_0
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
}
}
获取当前屏幕横竖屏状态
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
}