Определение ориентации iOS UIDevice - PullRequest
69 голосов
/ 03 февраля 2012

Мне нужно определить, когда устройство находится в портретной ориентации, чтобы я мог запустить специальную анимацию.Но я не хочу, чтобы мой вид автоматически поворачивался.

Как переопределить автоматический вид, когда устройство поворачивается в портретное положение?Моему приложению нужно отображать только его вид в альбомной ориентации, но мне кажется, что мне нужно поддерживать портретную ориентацию, даже если я хочу определить поворот к портретной ориентации.

Ответы [ 7 ]

170 голосов
/ 03 февраля 2012

Попробуйте выполнить следующее при загрузке приложения или при загрузке вашего представления:

[[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, когда вы добавляете наблюдатель, также удаляйте его в подходящее время (возможно, но не всегда, когда представление появляется / исчезает). Вы можете иметь только «пары» кода наблюдения / наблюдения. Если вы этого не сделаете, приложение вылетит. Выбор места наблюдения / наблюдения выходит за рамки этого QA. Однако вы должны иметь "unobserve", чтобы соответствовать приведенному выше коду "наблюдение".

16 голосов
/ 10 сентября 2015

Если вы пришли к этому вопросу в поисках того, как обнаружить изменение ориентации (без необходимости отключать вращение), вам также следует знать о 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)
}

А если вам не нужно беспокоиться об истинной ориентации:

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];
}

Смотри также

3 голосов
/ 20 июля 2015

1) Быстрая версия ответа Дэвида 2) Если вы все еще хотите обнаружить ориентацию, когда нет изменения ориентации (Swift vesion ответа Мо на Как я могу определить ориентацию устройства на 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())

ориентацияИзмененная функция

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
    }
}
1 голос
/ 03 февраля 2012

Если я правильно вас понимаю, ваше приложение только в альбомной ориентации.Вы можете просто указать в настройках приложения, что это только альбомная ориентация, и поэтому вам не нужно беспокоиться о повороте.Приложение будет запускаться в альбомной ориентации и оставаться там независимо от ориентации iPad.

0 голосов
/ 30 апреля 2017

.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()
    }
}
0 голосов
/ 29 августа 2016

Если вы не хотите создавать объект устройства, вы также можете использовать

-(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
    }
}
0 голосов
/ 03 февраля 2012

Сначала отключите все, кроме нужной вам ориентации (чтобы она не вращалась)

Тогда, как сказал Дэвид, просто получите текущую ориентацию устройства:

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

В качестве альтернативы вы можете просто использовать акселерометр самостоятельно (так как это так или иначе) и проверьте, где находится гравитация, чтобы увидеть, какую ориентацию он имеет. Если вы выберете такой подход, вы можете сами поиграть со значениями, чтобы получить разные результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...