基础概念
UIDeviceOrientation
UIDeviceOrientation,表示设备朝向,可以通过[UIDevice currentDevice] orientation]
获取,取值有:
typedef NS_ENUM(NSInteger, UIDeviceOrientation) {
UIDeviceOrientationUnknown, // 未知,启动时会出现
UIDeviceOrientationPortrait, // 竖屏,home键在底部
UIDeviceOrientationPortraitUpsideDown, // 倒立,home键在顶部
UIDeviceOrientationLandscapeLeft, // 左横屏,home键在右边
UIDeviceOrientationLandscapeRight, // 右横屏,home键在左边
UIDeviceOrientationFaceUp, // 屏幕朝上
UIDeviceOrientationFaceDown // 屏幕朝下
}
UIInterfaceOrientation
UIInterfaceOrientation,表示页面内容朝向,注意UIInterfaceOrientation和UIDeviceOrientation的关系,其中UIInterfaceOrientationLandscapeLeft = UIDeviceOrientationLandscapeRight,这是因为:
This is because rotating the device to the left requires rotating the content to the right.
不用特别细究两者之间关系,我们只需要根据需要设置好UIInterfaceOrientation即可,通过
[UIApplication shareApplication] statusBarOrientation]
可以获取当前状态栏朝向。
typedef NS_ENUM(NSInteger, UIInterfaceOrientation) {
UIInterfaceOrientationUnknown = UIDeviceOrientationUnknown,
UIInterfaceOrientationPortrait = UIDeviceOrientationPortrait,
UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown,
UIInterfaceOrientationLandscapeLeft = UIDeviceOrientationLandscapeRight,
UIInterfaceOrientationLandscapeRight = UIDeviceOrientationLandscapeLeft
};
UIInterfaceOrientationMask
UIInterfaceOrientationMask,是由页面内容朝向的二进制偏移组成,用来更方便描述某个界面支持的朝向。比如说下面的UIInterfaceOrientationMaskLandscape,其实就是由MaskLandscapeLeft和MaskLandscapeRight组成,这样可以方便描述设备支持两个横屏方向。
代码语言:javascript复制typedef NS_OPTIONS(NSUInteger, UIInterfaceOrientationMask) {
UIInterfaceOrientationMaskPortrait = (1 << UIInterfaceOrientationPortrait),
UIInterfaceOrientationMaskLandscapeLeft = (1 << UIInterfaceOrientationLandscapeLeft),
UIInterfaceOrientationMaskLandscapeRight = (1 << UIInterfaceOrientationLandscapeRight),
UIInterfaceOrientationMaskPortraitUpsideDown = (1 << UIInterfaceOrientationPortraitUpsideDown),
UIInterfaceOrientationMaskLandscape = (UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight),
UIInterfaceOrientationMaskAll = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown),
UIInterfaceOrientationMaskAllButUpsideDown = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight),
};
UIViewController相关
UIViewController关于横竖屏的三个方法:
- shouldAutorotate,页面是否允许自动旋转,被弃用api:
-shouldAutorotateToInterfaceOrientation
的取代者;默认值为YES,表示当前界面允许跟随设备旋转而自动旋转; - supportedInterfaceOrientations,该界面支持的界面朝向,可以返回四个朝向的任意组合,iPad默认值是四个朝向都支持,iPhone默认值是除了UpsideDown的三个朝向。这个方法回调的前提是shouldAutorotate=YES。
- preferredInterfaceOrientationForPresentation,该界面被present出来的界面朝向,可以返回四个朝向的任意组合。如果没有返回,则present时和原来界面保持一致。
AppDelegate相关
AppDelegate的supportedInterfaceOrientationsForWindow方法,根据需要返回当前window是否支持横屏。
代码语言:javascript复制- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window;
工程配置相关
在xcode的工程设置的General可以配置iPhone和iPad的页面朝向支持。
横竖屏切换实例
竖屏界面如何present横屏界面
竖屏present横屏是很普遍的场景,比如说视频播放场景的全屏切换,就可以在当前竖屏的界面present一个横屏播放界面的方式,实现横竖屏切换。具体的操作步骤只需要两步:
1,设置modalPresentationStyle为UIModalPresentationFullScreen; 2、preferredInterfaceOrientationForPresentation方法,返回UIInterfaceOrientationLandscapeRight;
比如说下面的LandscapeViewController界面:
代码语言:javascript复制// 点击时设置
- (void)onClick {
LandscapeViewController *landVC = [[LandscapeViewController alloc] init];
landVC.modalPresentationStyle = UIModalPresentationFullScreen;
[self presentViewController:landVC animated:YES completion:nil];
}
// LandscapeViewController内部代码
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return UIInterfaceOrientationLandscapeRight;
}
思考