检测iOS UIDevice方向

Jac*_*999 70 objective-c orientation uidevice ios swift

我需要检测设备何时处于纵向方向,以便我可以触发特殊动画.但我不希望我的观点自动旋转.

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

Dav*_*dek 170

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

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter]
   addObserver:self selector:@selector(orientationChanged:)
   name:UIDeviceOrientationDidChangeNotification
   object:[UIDevice currentDevice]];
Run Code Online (Sandbox Code Playgroud)

然后添加以下方法:

- (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;
   };
}
Run Code Online (Sandbox Code Playgroud)

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


注意

在iOS的所有情况下,当您添加一个观察者时,也要在适当的时候删除它(当视图出现/消失时,可能会,但并非总是如此).您只能拥有观察/取消观察代码的"对".如果你不这样做,应用程序将崩溃.选择观察/不观察的位置超出了本质量保证的范围.但是,你必须有一个"unobserve"来匹配上面的"观察"代码.


Sur*_*gch 18

如果你想到这个问题来寻找如何检测方向变化(不一定要禁用旋转),你也应该注意viewWillTransitionToSize,这可以从iOS 8获得.

来自这里的 Swift示例

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)
}
Run Code Online (Sandbox Code Playgroud)

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

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {

    // do something

    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
}
Run Code Online (Sandbox Code Playgroud)

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];
}
Run Code Online (Sandbox Code Playgroud)

如果你不需要担心实际的方向(取自这个答案):

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

也可以看看