Détection de l'orientation du dispositif iOS

je dois détecter quand l'appareil est en orientation portrait pour que je puisse lancer une animation spéciale. Mais je ne veux pas que ma vue soit autorotée.

comment modifier une vue en autorotation lorsque l'appareil est tourné vers portrait? Mon application a seulement besoin d'afficher sa vue dans le paysage, mais il semble que je dois soutenir portrait aussi si je veux être en mesure de détecter une rotation à portrait.

64
demandé sur Bartłomiej Semańczyk 2012-02-03 04:35:33

7 réponses

essayez de faire ce qui suit quand l'application charge ou quand votre vue charge:

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

ajouter la méthode suivante:

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

ce qui précède vous permettra de vous enregistrer pour des changements d'orientation de l'appareil sans activer l'autorotate de votre vue.


Note

dans tous les cas dans iOS, quand vous ajoutez un observateur, retirez-le aussi aux moments appropriés (éventuellement, mais pas toujours, lorsque la vue apparaît / disparaît). Vous ne pouvez avoir que des "paires" de code observez/unobserve. Si vous ne le faites pas l'application crash. Le choix de l'endroit où observer/retirer la réserve dépasse le cadre de cette assurance de la qualité. Cependant, vous devez avoir une " unobserve "pour correspondre au code" observer " ci-dessus.

166
répondu David M. Syzdek 2016-05-20 14:11:40

si vous êtes venu à cette question en cherchant comment détecter un changement d'orientation (sans nécessairement vouloir désactiver la rotation), vous devriez également être conscient de viewWillTransitionToSize , disponible auprès de iOS 8.

exemple Swift de ici

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)
}

et si vous n'avez pas à vous soucier de l'orientation réelle:

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

    // do something

    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
}

objectif - c exemple de ici

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

et si vous n'avez pas à vous soucier de l'orientation réelle (tiré de cette réponse ):

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

Voir aussi

14
répondu Suragch 2017-05-23 12:34:23

1) Version rapide de la réponse de David 2) dans le cas où vous voulez encore détecter l'orientation quand il n'y a pas de changement d'orientation (lésion rapide de la réponse de Moe à Comment puis-je détecter l'orientation de l'appareil sur 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 function

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
    }
}
3
répondu Tsuneyuki Ohsaki 2017-05-23 11:54:39

Si je vous comprends bien, votre application est paysage. Vous pouvez simplement spécifier dans la configuration des applications qu'il s'agit uniquement de paysage et que vous n'avez donc pas besoin de vous soucier de la rotation. L'application commencera dans landscape et y restera quelle que soit l'orientation de l'iPad.

1
répondu drekka 2012-02-03 00:55:25

d'abord désactiver tout sauf l'orientation que vous voulez (de sorte qu'il ne tourne pas)

alors comme David a dit juste obtenir l'orientation actuelle de l'appareil:

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

alternativement, vous pouvez simplement utiliser l'accéléromètre vous-même (puisque son comment il est fait de toute façon) et de vérifier où la gravité est à voir ce d'orientation. Si vous prenez cette approche, vous pouvez jouer avec les valeurs vous-même pour obtenir des résultats différents.

0
répondu Pochi 2012-02-03 01:29:05

si vous ne voulez pas créer d'objet périphérique, vous pouvez aussi utiliser

-(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
répondu B.Kosmowski 2016-08-29 07:57:56

.UIDeviceOrientationDidChange notification est appelé de nombreuses fois sur iphone, même lorsque l'appareil ne tourne pas. Ne sais pas la raison, mais si vous en avez besoin seulement lorsque l'appareil vraiment tourné, puis faire ce qui suit.

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

la méthode appelée de l'observateur devrait ressembler à ceci:

func orientationChanged() {

    if traitCollection.isIphone {

        defer {
            self.previousTraitCollectionForIphone = traitCollection
        }

        guard let previousTraitCollectionForIphone = previousTraitCollectionForIphone else {

            updateView()
            return
        }

        if previousTraitCollectionForIphone != traitCollection {
            updateView()
        }

    } else {
        updateView()
    }
}
0
répondu Bartłomiej Semańczyk 2017-05-01 07:07:41