一、屏幕旋转方向监听
1、UIDeviceOrientation
:设备方向
iOS 定义了七种设备方向:
typedef NS_ENUM(NSInteger, UIDeviceOrientation) {
UIDeviceOrientationUnknown, // 未知方向,可能是设备(屏幕)斜置
UIDeviceOrientationPortrait, // 设备(屏幕)直立
UIDeviceOrientationPortraitUpsideDown, // 设备(屏幕)直立,上下顛倒
UIDeviceOrientationLandscapeLeft, // 设备(屏幕)向左横置
UIDeviceOrientationLandscapeRight, // 设备(屏幕)向右橫置
UIDeviceOrientationFaceUp, // 设备(屏幕)朝上平躺
UIDeviceOrientationFaceDown // 设备(屏幕)朝下平躺
};
//注意:UIDeviceOrientation参考home键方向,如:home方向在右,设备(屏幕)方向向左(UIDeviceOrientationLandscapeLeft)
当设备方向变化时候,发出UIDeviceOrientationDidChangeNotification
通知;注册监听该通知,可以针不同的设备方向处理视图展示。
注:手机锁定竖屏后,UIDeviceOrientationDidChangeNotification
通知就失效了。
代码如下:
//开启和监听 设备旋转的通知(不开启的话,设备方向一直是UIInterfaceOrientationUnknown)
if (![UIDevice currentDevice].generatesDeviceOrientationNotifications) {
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
}
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(handleDeviceOrientationChange:)
name:UIDeviceOrientationDidChangeNotification object:nil];
//设备方向改变的处理
- (void)handleDeviceOrientationChange:(NSNotification *)notification{
UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
switch (ddeviceOrientation) {
case UIDeviceOrientationFaceUp:
NSLog(@"屏幕朝上平躺");
break;
case UIDeviceOrientationFaceDown:
NSLog(@"屏幕朝下平躺");
break;
case UIDeviceOrientationUnknown:
NSLog(@"未知方向");
break;
case UIDeviceOrientationLandscapeLeft:
NSLog(@"屏幕向左横置");
break;
case UIDeviceOrientationLandscapeRight:
NSLog(@"屏幕向右橫置");
break;
case UIDeviceOrientationPortrait:
NSLog(@"屏幕直立");
break;
case UIDeviceOrientationPortraitUpsideDown:
NSLog(@"屏幕直立,上下顛倒");
break;
default:
NSLog(@"无法辨识");
break;
}
}
//最后在dealloc中移除通知 和结束设备旋转的通知
- (void)dealloc{
//...
[[NSNotificationCenter defaultCenter]removeObserver:self];
[[UIDevice currentDevice]endGeneratingDeviceOrientationNotifications];
}
2、UIInterfaceOrientation
:界面方向
iOS 定义了五种界面方向
typedef NS_ENUM(NSInteger, UIInterfaceOrientation) {
UIInterfaceOrientationUnknown = UIDeviceOrientationUnknown, //未知方向
UIInterfaceOrientationPortrait = UIDeviceOrientationPortrait, //界面直立
UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown, //界面直立,上下颠倒
UIInterfaceOrientationLandscapeLeft = UIDeviceOrientationLandscapeRight, //界面朝左
UIInterfaceOrientationLandscapeRight = UIDeviceOrientationLandscapeLeft //界面朝右
} __TVOS_PROHIBITED;
注:界面方向和设别方向有对应关系,如界面的竖直方向就是 设备的竖直方向:UIInterfaceOrientationUnknown = UIDeviceOrientationUnknown
要想界面旋转,
在如图所示选择支持的界面旋转方向:
同时在
UIViewController
中加入以下两个方法:
///是否支持自动转屏
-(BOOL)shouldAutorotate
{
return YES;///很明显如果返回YES就可以,返回NO就不行
}
///如果上面方法返回YES则会根据这个方法判断支持的方向
-(UIInterfaceOrientationMask)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskAll;///这个是所有方向
}
当界面方向变化时候,先后发出 UIApplicationWillChangeStatusBarOrientationNotification
和 UIApplicationDidChangeStatusBarOrientationNotification
通知,手机锁定竖屏后,这两个通知也失效了;注册监听这两个通知,可以针对不同的界面方向处理视图展示。
代码如下所示:
//以监听UIApplicationDidChangeStatusBarOrientationNotification通知为例
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(handleStatusBarOrientationChange:)
name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];
//界面方向改变的处理
- (void)handleStatusBarOrientationChange: (NSNotification *)notification{
UIInterfaceOrientation interfaceOrientation = [[UIApplication sharedApplication] statusBarOrientation];
switch (interfaceOrientation) {
case UIInterfaceOrientationUnknown:
NSLog(@"未知方向");
break;
case UIInterfaceOrientationPortrait:
NSLog(@"界面直立");
break;
case UIInterfaceOrientationPortraitUpsideDown:
NSLog(@"界面直立,上下颠倒");
break;
case UIInterfaceOrientationLandscapeLeft:
NSLog(@"界面朝左");
break;
case UIInterfaceOrientationLandscapeRight:
NSLog(@"界面朝右");
break;
default:
break;
}
}
//最后在dealloc中移除通知
- (void)dealloc{
//...
[[NSNotificationCenter defaultCenter]removeObserver:self];
[[UIDevice currentDevice]endGeneratingDeviceOrientationNotifications];
}
3、UIInterfaceOrientationMask
UIInterfaceOrientationMask
是为了集成多种UIInterfaceOrientation
而定义的类型,和UIViewController
相关,一共有7种
iOS中的UIInterfaceOrientationMask
定义
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),
} __TVOS_PROHIBITED;
在ViewController
可以重写- (UIInterfaceOrientationMask)supportedInterfaceOrientations
方法返回类型,来决定UIViewController
可以支持哪些界面方向。
//支持界面直立
- (UIInterfaceOrientationMask)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}
二、视图控制器中旋转方向的设置
1、禁止横屏操作
- 方法一:在项目的General-->Deployment Info-->Device Orientation中,只勾选Portrait(竖屏)
- 方法二:
Device Orientation
默认设置,在Appdelegate
中实现supportedInterfaceOrientationsForWindow:
只返回UIInterfaceOrientationMaskPortraitt
(竖屏)
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
return UIInterfaceOrientationMaskPortrait;
}
参考链接:http://www.cocoachina.com/ios/20170711/19808.html
项目Demo托管在[GitHub][]上
[GitHub]:https://github.com/lizishiye/DeviceOrientation_Demo