本文讲述动态控制自动旋转方向(1到3),手动旋转屏幕方向(第4),以及通过旋转vc的view假旋转屏幕方向。
在需要配置方向的vc中 覆盖这个函数
- (BOOL)shouldAutorotate {
return YES;
}
在需要配置方向的vc中 覆盖这个函数,返回值可以动态改动,来实现手动控制屏幕旋转方向
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskAll;
}
在AppDelegate中覆盖这个函数,返回值可以动态改动,来实现手动控制屏幕旋转方向
- (UIInterfaceOrientationMask) application:(UIApplication *)application
supportedInterfaceOrientationsForWindow:(UIWindow *)window {
return UIInterfaceOrientationMaskAll;
}
当配置了以上所有步骤,其实屏幕就可以自动旋转方向了,可以旋转的方向就是他们返回的值。
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
UIInterfaceOrientationMask orientationMask = UIInterfaceOrientationMaskLandscapeRight;
UIDeviceOrientation deviceOrientation = UIDeviceOrientationLandscapeRight;
if (@available(iOS 16.0, *)) {
[self setNeedsUpdateOfSupportedInterfaceOrientations];
NSArray *array = [[[UIApplication sharedApplication] connectedScenes] allObjects];
UIWindowScene *scene = [array firstObject];
UIWindowSceneGeometryPreferencesIOS *geometryPreferencesIOS = [[UIWindowSceneGeometryPreferencesIOS alloc] initWithInterfaceOrientations:orientationMask];
[scene requestGeometryUpdateWithPreferences:geometryPreferencesIOS
errorHandler:^(NSError *_Nonnull error) {
NSLog(@"屏幕旋转 错误:%@", error);
}];
} else {
[[UIDevice currentDevice] setValue:@(deviceOrientation) forKey:@"orientation"];
[UIViewController attemptRotationToDeviceOrientation];
}
[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
需要注意的点是,当手动旋转的时候需要配合修改vc支持方向和应用返回方向的值,这样才能转过去。之所以不使用所有方向,是因为自动旋转会进行干扰,比如屏幕在物理当前是竖直状态,自动旋转就会旋转到竖直,手动旋转可能就会失败哟。
如果不想像上面那样麻烦控制,直接旋转View也是一个旋转屏幕的方法。但是这个方法有个问题是,设备方向没有真正旋转,所以状态栏方向可能是错的,下拉锁屏方向看起来也会有些异常。
- (BOOL)prefersStatusBarHidden {
return _isRight;
}
-(void)changeOrientationRight {
//设备方向没有转动,所以状态栏方向是错的,要隐藏
_isRight = YES;
[self setNeedsStatusBarAppearanceUpdate];
self.view.transform = CGAffineTransformMakeRotation(M_PI/2);
CGSize size = UIScreen.mainScreen.bounds.size;
self.view.bounds = CGRectMake(0, 0, size.height, size.width);
}