如何在 iOS 6 中以编程方式获取设备的当前方向?
Posted
技术标签:
【中文标题】如何在 iOS 6 中以编程方式获取设备的当前方向?【英文标题】:How to get current orientation of device programmatically in iOS 6? 【发布时间】:2012-12-12 09:26:23 【问题描述】:我开发了一个 ios 应用并在 iOS6 设备上进行了测试。在测试时,我意识到我的应用没有像预期的那样响应方向变化。
这是我的代码:
// Autorotation (iOS >= 6.0)
- (BOOL) shouldAutorotate
return NO;
- (NSUInteger)supportedInterfaceOrientations
return UIInterfaceOrientationMaskAll;
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
return UIInterfaceOrientationMaskPortrait;
确切地说,我想知道在 iOS 中,Orientation Changes 调用了哪些方法。
【问题讨论】:
"我的代码在方向上不起作用。"是什么意思? 其实我想知道当我旋转我的设备时调用了哪个方法..? 它会调用 shouldAutorotate 方法和支持的界面定位方法 @MidhunMP 此方法在 iOS 6 中已弃用...这就是原因。 那是个误会,引入了shouldAutoRotate
方法,而不是shouldAutorotateToInterfaceOrientation
。并且可以在iOS5和iOS 6中使用
【参考方案1】:
你可以试试这个,可能对你有帮助:
How to change the device orientation programmatically in iOS 6
或
目标-c:
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]
斯威夫特:
if UIDevice.current.orientation.isLandscape
// Landscape mode
else
// Portrait mode
【讨论】:
请注意The value of |orientation| property always returns 0 unless orientation notifications have been enabled by calling beginGeneratingDeviceOrientationNotifications.
Docs
请注意,这与获取 ViewController 方向不同,因为它可能是横向的,但 UIDevice.current.orientation.isLandscape 仍可能返回 false。在我的例子中 UIDevice.current.orientation 是 .faceUp。【参考方案2】:
你可以试试这个,解决你的问题。
UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
请参阅下面的链接以获取App extension
Get device current orientation (App Extension)
【讨论】:
真是个坏主意。不要挂在那个属性上。 有人可以设置此属性statusBarOrientation
,它将不再与真正的interfaceOrientation
相同。 The status-bar orientation set by this method does not change if the device changes orientation.
@DanSkeel 怎么可能。我们使用此属性获得准确的当前方向。如果我们强行设置状态栏方向,那么我们有责任小心处理。
如果您编写一些工具或框架,您将无法控制所有代码。所以如果你想确定没有人这样做,你应该避免它。恕我直言。
我的意思是你无法控制使用你的框架的整个应用程序的代码。因为您正在编写框架,而不是应用程序。并且开发者可以设置而你不会知道。【参考方案3】:
也许很愚蠢,但它正在工作(仅在 ViewController 中):
if (self.view.frame.size.width > self.view.frame.size.height)
NSLog(@"Hello Landscape");
【讨论】:
非常有效。【参考方案4】: @property (nonatomic) UIDeviceOrientation m_CurrentOrientation ;
/* 您需要在您的 ViewDidload 或 ViewWillAppear 中声明这些代码 */
- (void)viewDidLoad
[super viewDidLoad];
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(deviceOrientationDidChange:) name: UIDeviceOrientationDidChangeNotification object: nil];
/* 现在我们的设备会在我们改变设备方向时发出通知,因此您可以使用当前方向控制您的代码或程序 */
- (void)deviceOrientationDidChange:(NSNotification *)notification
//Obtaining the current device orientation
/* Where self.m_CurrentOrientation is member variable in my class of type UIDeviceOrientation */
self.m_CurrentOrientation = [[UIDevice currentDevice] orientation];
// Do your Code using the current Orienation
【讨论】:
如何使用 self.m_CurrentOrientation 检查纵向和横向? if (UIDeviceOrientationIsLandscape(self.m_CurrentOrientation) // 横向代码 【参考方案5】:按照UIDevice 上的文档进行操作。
你需要打电话
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
然后每次改变方向时你都会收到一个 UIDeviceOrientationDidChangeNotification。
【讨论】:
【参考方案6】:This tutorial 给出了如何使用UIDeviceOrientationDidChangeNotification
处理设备旋转的简单概述。它应该可以帮助您了解如何使用UIDeviceOrientationDidChangeNotification
在设备方向更改时收到通知。
【讨论】:
【参考方案7】:UIDevice.current.orientation.isLandscape
接受的答案如上所述读取设备的方向,报告的方向可能与您的视图控制器的方向不同,尤其是当您的设备几乎处于水平位置时。
要获取 视图控制器 的方向,您可以使用其 interfaceOrientation
属性,该属性自 iOS 8.0 起已弃用,但仍能正确报告。
【讨论】:
【参考方案8】:在您的 ViewController 中,您可以使用didRotateFromInterfaceOrientation:
方法来检测设备何时旋转,然后在每个方向上执行您需要的任何操作。
例子:
#pragma mark - Rotation
-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
switch (orientation)
case 1:
case 2:
NSLog(@"portrait");
// your code for portrait...
break;
case 3:
case 4:
NSLog(@"landscape");
// your code for landscape...
break;
default:
NSLog(@"other");
// your code for face down or face up...
break;
【讨论】:
【参考方案9】:斯威夫特5答案
订阅有关方向变化的通知:
override func viewDidLoad()
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(orientationChangedFromNotification), name: UIDevice.orientationDidChangeNotification, object: nil)
处理通知:
@objc func orientationChangedFromNotification()
self.updateUIForOrientation()
处理方向变化:
func updateUIForOrientation()
let orientation = UIDevice.current.orientation
//TODO: Your logic
注意:这将告诉您物理设备的方向。也可以访问应用的界面方向:
UIApplication.shared.delegate?.window?.windowScene?.interfaceOrientation
【讨论】:
以上是关于如何在 iOS 6 中以编程方式获取设备的当前方向?的主要内容,如果未能解决你的问题,请参考以下文章