检测iOS UIDevice方向

我需要检测什么时候该设备是纵向的,以便我可以发射一个特殊的animation。 但是我不希望我的观点自动化。

当设备旋转到肖像时,如何覆盖视图自动旋转? 我的应用程序只需要在横向上显示它的视图,但是如果我想能够检测旋转到纵向,我似乎还需要支持纵向。

加载应用程序或加载视图时,请尝试执行以下操作:

 [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:[UIDevice currentDevice]]; 

然后添加下面的方法:

 - (void) orientationChanged:(NSNotification *)note { UIDevice * device = note.object; switch(device.orientation) { case UIDeviceOrientationPortrait: /* start special animation */ break; case UIDeviceOrientationPortraitUpsideDown: /* start special animation */ break; default: break; }; } 

以上将允许您注册设备的方向更改,而不启用视图的自动旋转。


注意

在iOS中的所有情况下,当您添加一个观测器时,也可以在适当的时候将其删除(可能,但并不总是当视图出现/消失时)。 您只能有观察/不可观察代码的“对”。 如果你不这样做,应用程序将崩溃。 select观察/不观察的地方超出了本质量保证范围。 然而,你必须有一个“unobserve”来匹配上面的“观察”代码。

如果你想了解如何检测方向变化(不一定要禁用旋转),还应该注意viewWillTransitionToSize ,它可以在iOS 8中使用。

从这里迅速的例子

 override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { coordinator.animateAlongsideTransition({ (UIViewControllerTransitionCoordinatorContext) -> Void in let orient = UIApplication.sharedApplication().statusBarOrientation switch orient { case .Portrait: println("Portrait") // Do something default: println("Anything But Portrait") // Do something else } }, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in println("rotation completed") }) super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator) } 

如果你不需要担心实际的方向:

 override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { // do something super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator) } 

Objective-C例子来自这里

 - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) { UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; // do whatever } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) { }]; [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; } 

如果你不需要担心实际的方向(从这个答案中获得 ):

 - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { // Do view manipulation here. [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; } 

也可以看看

  • iOS 8方向更改检测
  • iOS8逐日::第14天::轮换弃用

1)大卫答案的快速版本2)如果你还想在没有方向改变的情况下检测方向(Moe的答案是如何检测iOS设备的方向? )

  // Initial device orientation let orientation: UIInterfaceOrientation = UIApplication.sharedApplication().statusBarOrientation if(orientation == UIInterfaceOrientation.Unknown){ // code for Unknown } else if(orientation == UIInterfaceOrientation.Portrait){ // code for Portrait } else if(orientation == UIInterfaceOrientation.PortraitUpsideDown){ // code for Portrait } else if(orientation == UIInterfaceOrientation.LandscapeRight){ // code for Landscape } else if(orientation == UIInterfaceOrientation.LandscapeLeft){ // ode for Landscape } // To detect device orientation change UIDevice.currentDevice().beginGeneratingDeviceOrientationNotifications() NSNotificationCenter.defaultCenter().addObserver( self, selector: "orientationChanged:", name: UIDeviceOrientationDidChangeNotification, object: UIDevice.currentDevice()) 

orientationChanged函数

 func orientationChanged(note: NSNotification) { let device: UIDevice = note.object as! UIDevice switch(device.orientation) { case UIDeviceOrientation.Portrait: // code for Portrait break case UIDeviceOrientation.PortraitUpsideDown: // code for Portrait break case UIDeviceOrientation.LandscapeLeft: // code for Landscape break case UIDeviceOrientation.LandscapeRight: // code for Landscape break case UIDeviceOrientation.Unknown: // code for Unknown break default: break } } 

如果我正确理解你,你的应用程序只是风景。 您只需在应用程序设置中指定它只是横向的,因此不需要担心旋转。 无论iPad如何定位,该应用都将从风景中开始,留在那里。

首先禁用除了你想要的方向以外(所以它不旋转)

那么就像大卫说的那样,刚刚获得设备的当前方向

https://developer.apple.com/library/ios/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/MotionEvents/MotionEvents.html

或者,你可以自己使用加速度计(因为它是如何完成的),并检查重力在哪里,看看它有什么样的方向。 如果你采取这种方法,你可以自己玩这些值来获得不同的结果。

如果你不想创build设备对象,也可以使用

 -(void) seObserverForOrientationChanging { [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:[UIDevice currentDevice]]; } - (void) orientationChanged:(NSNotification *)note { if (UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)){ //Do something in landscape } else { //Do something in portrait } } 

.UIDeviceOrientationDidChange通知在iPhone上多次调用,即使设备没有旋转。 不知道原因,但是只有当设备真正旋转时才需要它,然后执行以下操作。

 NotificationCenter.default.addObserver(self, selector: #selector(orientationChanged), name: .UIDeviceOrientationDidChange, object: nil) 

从观察者调用的方法应该是这样的:

 func orientationChanged() { if traitCollection.isIphone { defer { self.previousTraitCollectionForIphone = traitCollection } guard let previousTraitCollectionForIphone = previousTraitCollectionForIphone else { updateView() return } if previousTraitCollectionForIphone != traitCollection { updateView() } } else { updateView() } }