如何在 iOS 上检测设备的方向?
我有一个关于如何在 iOS 上检测设备方向的问题。我不需要接收更改通知,只需接收当前方向本身。这似乎是一个相当简单的问题,但我一直无法理解它。以下是我到目前为止所做的:
UIDevice *myDevice = [UIDevice currentDevice] ;
[myDevice beginGeneratingDeviceOrientationNotifications];
UIDeviceOrientation deviceOrientation = myDevice.orientation;
BOOL isCurrentlyLandscapeView = UIDeviceOrientationIsLandscape(deviceOrientation);
[myDevice endGeneratingDeviceOrientationNotifications];
在我看来,这应该可行。我使设备能够接收设备方向通知,然后询问它所处的方向,但随后它不起作用,我不知道为什么。
I have a question on how to detect the device orientation on iOS. I don't need to receive change notifications, just the current orientation itself. This seems to be a rather simple question, but I haven't been able to wrap my head around it. Below is what I have done so far:
UIDevice *myDevice = [UIDevice currentDevice] ;
[myDevice beginGeneratingDeviceOrientationNotifications];
UIDeviceOrientation deviceOrientation = myDevice.orientation;
BOOL isCurrentlyLandscapeView = UIDeviceOrientationIsLandscape(deviceOrientation);
[myDevice endGeneratingDeviceOrientationNotifications];
In my mind this should work. I enable the device to receive device orientation notices, then ask for what orientation it is in, but then it is not working and I don't know why.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(13)
确实很旧的线程,但没有真正的解决方案。
我遇到了同样的问题,但发现获取 UIDeviceOrientation 并不总是一致,所以改为使用:
Really old thread, but no real solution.
I Had the same problem, but found out that getting The UIDeviceOrientation isn't always consistent, so instead use this:
if UIViewController:
if UIView:
UIDevice.h:
已更新:
将此代码添加到 xxx-Prefix.pch 然后您可以在任何地方使用它:
用法:
if UIViewController:
if UIView:
UIDevice.h:
Updated:
add this code to xxx-Prefix.pch then you can use it anywhere:
usage:
对于您首先要寻找的内容,如果方向发生变化,您必须收到通知!
你可以在 viewDidLoad 中设置这个东西,就像
每当你的设备方向改变时 OrientationDidChange 调用,你可以根据方向做任何你想做的事情
For what You looking for first you have to Get Notification if Orientation Changed!
You Can set This Thing in viewDidLoad like
and whenever Orientation of your Device changed OrientationDidChange Called where You can do whatever You Want as Per Orientation
如果您想直接从加速度计获取设备方向,请使用
[[UIDevice currentDevice]orientation]
。但是,如果您需要应用程序的当前方向(界面方向),请使用[[UIApplication sharedApplication] statusBarOrientation]
。If you want to get device orientation directly from accelerometer use
[[UIDevice currentDevice] orientation]
. But if you need current orientation of your application(interface orientation) use[[UIApplication sharedApplication] statusBarOrientation]
.UIViewController
有一个interfaceOrientation
属性,您可以访问该属性来找出视图控制器的当前方向。至于你的例子,那应该有效。当你说它不起作用时,你的意思是什么?与您的预期相比,它给您带来了什么结果?
UIViewController
has aninterfaceOrientation
property that you can access to find out the current orientation of a view controller.As for your example, that should work. When you say it isn't working, what do you mean? What results does it give you versus what you expected?
获取设备方向。
从您的应用获取设备方向
to get device orientation.
to get device orientation from your app
“UIDeviceOrientation” 不满意,因为当 UIViewcontroller 方向固定为特定方向时,您无法获得与设备方向相关的信息,因此正确的做法是使用 “UIInterfaceOrientation”。
您可以使用 "self.interfaceOrientation" 从 UIViewController 获取方向,但是当您分解我们的代码时,您可能需要在视图控制器之外进行此类测试(自定义视图、类别...),因此您仍然可以使用 rootviewController 访问控制器之外的任何位置的信息:
Wasn't satisfied by "UIDeviceOrientation" because when a UIViewcontroller orientation is fixed to a specific orientation you don't get a pertinent information with the device orientation, so the right thing to do is using "UIInterfaceOrientation".
You can get the orientation from the UIViewController with a "self.interfaceOrientation", but when you are factorizing our code, you might need to do this kind of test outside a view controller, (custom view, a category…), so you still can access the information anywhere outside the controller by using the rootviewController:
无论是否启用方向锁定,都有一种方法可以通过使用 CoreMotion 中的数据来实现此目的。
这是代码:
There's a way to achieve this whether the orientation lock is enabled or not by using data from CoreMotion.
This is the code:
您是否已解锁设备方向的硬件锁?我的 iPad 1 边缘有一个。
Have you unlocked the hardware lock for device orientation? There is one at the edge of my iPad 1.
以下是一些使检测更容易的 Swift 变量:
Here is some Swift variables to make detection easier:
我目前的做法是:
如果由于某种原因没有 rootViewController 但无法安全地访问 statusBarOrientation...
My current way of doing this:
If there is for some reason no rootViewController yet fail safe to statusBarOrientation...
以及 swift 中最可靠的方法:
And the best reliable way in swift :
这是我使用组合的解决方案,它非常容易与 SwiftUI 或常规 Swift 对象一起使用。对于这种真正的全局对象来说,单例对象(静态实例)比“环境”更好。
This is my solution with Combine, which is quite easy to use with SwiftUI or regular Swift Object. A singleton object (static instance) is better than the "environment" for this kind of truly global object.