iOS 全局配置屏幕旋转权限支持不同页面的展示方向

通读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];

三、代码在运行iPad上过程中, supportedInterfaceOrientationsForWindow 不调用的问题.

fix: 打开Device Orientation 属性配置, 勾选Requires full screen选项即可

Device Orientation 属性配置:

项目 -> TARGET -> General -> Deployment Info


默认的勾选配置

开启Requires full screen
  • Requires full screen 勾选, 代表着iPad 需要全屏幕展示, 也就代表着存在横竖屏幕的情况, window尺寸无非是横竖屏幕变换
  • Requires full screen 未勾选, 代表着iPad 不需要全屏幕展示, 也就代表着不存在横竖屏幕的情况, window尺寸可以随便变换, 只有宽和高的定义, 一般用来支持iPad项目分屏处理

结语

路漫漫其修远兮,吾将上下而求索~

作者简书

作者掘金

作者GitHub

.End

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容