通读iOS 屏幕旋转的实践解析可以知道, 设置屏幕旋转的全局权限主要有两种方式, 且代码设置的优先级高于Device Orientation 属性配置
;
因此通过代码在Appdelegate
中设置屏幕旋转的全局权限
, 然后在需要使用的地方来设置是否支持屏幕旋转
即可:
一、代码设置屏幕旋转的全局权限 (有注释)
Appdelegate.h
@interface AppDelegate : UIResponder <UIApplicationDelegate>
/** iPhone 是否支持转屏 */
@property (nonatomic, assign, getter=isAllowRotate) BOOL allowRotate;
/** iPad 是否支持转屏 */
@property (nonatomic, assign, getter=isIPadAllowRotate) BOOL iPadAllowRotate;
/** 是否不支持竖屏, 一般用于视频的全屏播放 */
@property (nonatomic, assign, getter=isNonSupportPortraitOrientations) BOOL nonSupportPortraitOrientations;
- (void)resetAllowRotate:(NSNumber *)theAllowRotate;
- (void)resetIPadAllowRotate:(NSNumber *)theAllowRotate;
- (void)resetNonSupportPortraitOrientations:(NSNumber *)isNonSupport;
@end
Appdelegate.m
#pragma mark - Orientations
- (void)resetAllowRotate:(NSNumber *)theAllowRotate {
_allowRotate = [theAllowRotate boolValue];
}
- (void)resetNonSupportPortraitOrientations:(NSNumber *)isNonSupport {
_nonSupportPortraitOrientations = [isNonSupport boolValue];
}
- (void)resetIPadAllowRotate:(NSNumber *)theAllowRotate {
[self resetAllowRotate:theAllowRotate];
_iPadAllowRotate = [theAllowRotate boolValue];
}
// 返回需要支持的方向
// 如果我们实现了Appdelegate的这一方法,那么我们的App的全局旋转设置将以这里的为准
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
if (self.isAllowRotate) {
if (self.isNonSupportPortraitOrientations) {
return UIInterfaceOrientationMaskLandscape;
} else {
return UIInterfaceOrientationMaskAllButUpsideDown;
}
} else {
return UIInterfaceOrientationMaskPortrait;
}
}
当然, 示例代码表示在未进行特殊处理
的情况下, 仅支持UIInterfaceOrientationMaskPortrait
, 也就是竖屏
显示. 按照想所需的业务场景可自行配置。
另外, 当系统屏幕旋转开关锁定时, 不论supportedInterfaceOrientationsForWindow
支持那些方向, 项目都不会跟随手机感应器旋转。
二、需要的位置设置是否支持横竖屏幕
以Appdelegate.m
示例代码为例, 想进入一个横屏的视频播放界面, 就需要在进入之前
设置屏幕支持
旋转, 退出视频之后
再取消
支持屏幕旋转。
这里是权限设置的一个封装方法:
- (void)setResetAllowRotate:(BOOL)allowRotate {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"
if ([[UIApplication sharedApplication].delegate respondsToSelector:@selector(resetAllowRotate:)]) {
[[UIApplication sharedApplication].delegate performSelector:@selector(resetAllowRotate:) withObject:[NSNumber numberWithBool:allowRotate]];
}
#pragma clang diagnostic pop
}
2.1 在进入横屏页面之前调用:
[self setResetAllowRotate:YES];
2.2 在退出横屏页面之后调用:
[self setResetAllowRotate:NO];
- 针对预处理指令的意义有不理解的, 可以参考iOS #pragma & #pragma clang diagnostic
三、代码在运行iPad上过程中, supportedInterfaceOrientationsForWindow 不调用的问题.
fix: 打开Device Orientation 属性配置, 勾选Requires full screen
选项即可。
Device Orientation 属性配置:
项目 -> TARGET -> General -> Deployment Info
-
Requires full screen 勾选, 代表着iPad 需要全屏幕展示, 也就代表着
存在
横竖屏幕的情况, window尺寸无非是横竖屏幕变换
。 -
Requires full screen 未勾选, 代表着iPad 不需要全屏幕展示, 也就代表着
不存在
横竖屏幕的情况, window尺寸可以随便变换,只有宽和高的定义
, 一般用来支持iPad项目分屏处理。
结语
路漫漫其修远兮,吾将上下而求索~
.End