在应用扩展中检测方向的最佳方法是啥?
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
【讨论】:
以上是关于在应用扩展中检测方向的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章