在应用扩展中检测方向的最佳方法是啥?

Posted

技术标签:

【中文标题】在应用扩展中检测方向的最佳方法是啥?【英文标题】:What is the best way to detect orientation in an app extension?在应用扩展中检测方向的最佳方法是什么? 【发布时间】:2014-09-14 05:45:09 【问题描述】:

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

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

Get device current orientation (App Extension)

我查看了 size classes 和 UITraitCollection 并发现设备错误地报告它是纵向的,而实际上它是横向的(不确定这是否是操作系统错误,或者我没有查询正确的 API正确的方式)。

最好的方法是什么:

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

谢谢,

【问题讨论】:

【参考方案1】:

我也遇到过这个问题并查看了您的示例,但没有一个好的解决方案。 我是如何解决的:我创建了一个类,它对 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   

如果您想获得设备方向的准确侧面(左、右、倒置),这种方法无法解决您的问题。它只返回纵向或横向方向。

希望对你有所帮助。

【讨论】:

我运行了那个代码,当设备实际上是纵向时它返回横向?我仍然对 ios 8 的方向变化感到困惑。据我所知,框架不会改变,但边界会随着方向改变。现在它只是被崇敬还是? user519274 - 感谢您的评论。它仍然有效。你把代码放在正确的地方了吗?它应该在 UIViewController 的 viewWillLayoutSubviews 或 viewDidLayoutSubviews 方法中。 但是如何获取设备方向是landScapeLeft 或ladnScapeRight 就像这个***.com/questions/25462091/… Anand K,我在回答中对此进行了描述。提供的代码无法计算横向或纵向模式的确切边。【参考方案2】:

您可以通过在 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

谢谢

【讨论】:

【参考方案3】:

我的共享扩展针对 iOS 14.0 或更高版本,其他用户提供的答案建议订阅 UIApplicationWillChangeStatusBarOrientationNotification 通知,该通知自 iOS 13 起已弃用。

UIApplication.h 中的弃用说明建议改用viewWillTransitionToSize:withTransitionCoordinator:,这对我来说效果很好。我已经在我的共享扩展的根视图控制器上定义了这条消息。我必须从提供的尺寸中推断出方向,如下所示:

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator

    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];

    if (size.height > size.width) 
        // setup your UI for portrait orientation
    
    else 
        // setup your UI for landscape orientation
    

【讨论】:

以上是关于在应用扩展中检测方向的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

检测功能键被按下的最佳方法是啥?

比较两个 NSArray 并检测更改的最佳方法是啥

在 C/C++ 项目中自动检测库依赖关系的最佳方法是啥?

检测移动设备的最佳方法是啥?

在 Javascript 中进行浏览器检测的最佳方法是啥?

用 php 检测浏览器的最佳方法是啥?