在应用程序扩展中检测设备方向的最佳方法是什么?我在这里找到了解决方案的结果好坏参与:
How to detect Orientation Change in Custom Keyboard Extension in iOS 8?
Get device current orientation (App Extension)
我查看了大小类和UITraitCollection
,发现设备不准确地报告它是纵向的,当它实际上是横向时(不确定这是OS错误,还是我没有查询右边API正确的方式)。
完成的最佳方法是什么:
谢谢,
答案 0 :(得分:19)
我遇到了这个问题,并查看了你的例子,但没有一个很好的解决方案。 我是如何解决它的:我创建了一个类来对UIScreen值进行一些计算并返回自定义的设备方向。
班级标题:
typedef NS_ENUM(NSInteger, InterfaceOrientationType) {
InterfaceOrientationTypePortrait,
InterfaceOrientationTypeLandscape
};
@interface InterfaceOrientation : NSObject
+ (InterfaceOrientationType)orientation;
@end
实现:
@implementation InterfaceOrientation
+ (InterfaceOrientationType)orientation{
CGFloat scale = [UIScreen mainScreen].scale;
CGSize nativeSize = [UIScreen mainScreen].currentMode.size;
CGSize sizeInPoints = [UIScreen mainScreen].bounds.size;
InterfaceOrientationType result;
if(scale * sizeInPoints.width == nativeSize.width){
result = InterfaceOrientationTypePortrait;
}else{
result = InterfaceOrientationTypeLandscape;
}
return result;
}
@end
我把它放到viewWillLayoutSubviews或viewDidLayoutSubviews方法来捕捉方向更改事件。
if([InterfaceOrientation orientation] == InterfaceOrientationTypePortrait){
// portrait
}else{
// landscape
}
如果您想获得设备方向的确切一面(左侧,右侧,上下颠倒),此方法无法解决您的问题。它只返回纵向或横向。
希望它会对你有所帮助。
答案 1 :(得分:1)
您可以通过在UIApplicationWillChangeStatusBarOrientationNotification上添加观察者然后按如下方式提取方向来获取扩展中的设备方向。
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationWillChange:) name:UIApplicationWillChangeStatusBarOrientationNotification object:nil];
}
- (void)orientationWillChange:(NSNotification*)n
{
UIInterfaceOrientation orientation = (UIInterfaceOrientation)[[n.userInfo objectForKey:UIApplicationStatusBarOrientationUserInfoKey] intValue];
if (orientation == UIInterfaceOrientationLandscapeLeft)
//handle accordingly
else if (orientation == UIInterfaceOrientationLandscapeRight)
//handle accordingly
else if (orientation == UIInterfaceOrientationPortraitUpsideDown)
//handle accordingly
else if (orientation == UIInterfaceOrientationPortrait)
//handle accordingly
}
由于