1.一般常用的方法
1)添加监听
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationDidChange) name:UIDeviceOrientationDidChangeNotification object:nil];
2)判断方向,强制横竖屏
if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {
SEL selector = NSSelectorFromString(@"setOrientation:");
NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];
[invocation setSelector:selector];
[invocation setTarget:[UIDevice currentDevice]];
int val = self.currentOrientation;
// 从2开始是因为0 1 两个参数已经被selector和target占用
[invocation setArgument:&val atIndex:2];
[invocation invoke];
}
2.由于上面监听的方法还会有其他的状态UIDeviceOrientationUnknown/UIDeviceOrientationFaceUp导致一些复杂的业务处理的不是很好,无法精准的判断是横屏还是竖屏,为此自己使用的方法是通过监听屏幕方向变化计算屏幕的宽高来精准的判断横竖屏.
if ([KKUIDeviceOrientation defaultDeviceOrientation].deviceDirection == HorizonDirection) {
//横屏
}else{
//竖屏
}
代码如下:
#importtypedef enum : NSUInteger {
/**
* 竖屏
*/
VerticalDirection,
/**
* 横屏
*/
HorizonDirection
} DeviceDirection;
@interface KKUIDeviceOrientation : NSObject
/**
* 注意:先在要需要使用的地方调用一下(最好在appdelegate里初始化一下)
*/
+(instancetype)defaultDeviceOrientation;
/**
* 屏幕方向
*/
@property(nonatomic,assign)DeviceDirection deviceDirection;
@end
#import "KKUIDeviceOrientation.h"
@interface KKUIDeviceOrientation ()
@end
@implementation KKUIDeviceOrientation
+(instancetype)defaultDeviceOrientation{
static KKUIDeviceOrientation* _instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[KKUIDeviceOrientation alloc] init];
_instance.deviceDirection = VerticalDirection;//默认是竖屏
[_instance listenNotification];
});
return _instance;
}
-(void)listenNotification{
//屏幕横竖屏切换的系统通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(listenOrientationDidChange) name:UIDeviceOrientationDidChangeNotification object:nil];
}
-(void)listenOrientationDidChange{
// 320(iphone5) 375(iphone6) 414(iphoneXplus)
CGFloat width = [UIScreen mainScreen].bounds.size.width;
if (width==320||width==375||width==414) {
self.deviceDirection = VerticalDirection;
}else{
self.deviceDirection = HorizonDirection;
}
}
iOS小白一枚,如有不对的地方,还望大神指正
网友评论