在应用扩展程序中检测方向的最佳方法是什么?

时间:2014-09-14 05:45:10

标签: ios orientation ios8 screen-orientation ios-app-extension

在应用程序扩展中检测设备方向的最佳方法是什么?我在这里找到了解决方案的结果好坏参与:

How to detect Orientation Change in Custom Keyboard Extension in iOS 8?

Get device current orientation (App Extension)

我查看了大小类和UITraitCollection,发现设备不准确地报告它是纵向的,当它实际上是横向时(不确定这是OS错误,还是我没有查询右边API正确的方式)。

完成的最佳方法是什么:

  • 首次加载扩展程序时设备的当前方向
  • 设备将旋转到的方向
  • 设备旋转到的方向

谢谢,

2 个答案:

答案 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
}

由于