web-dev-qa-db-fra.com

Comment forcer ou désactiver l'orientation de l'interface pour certains UIViewController mais pas tous?

J'ai une application avec 9-10 écrans. J'ai incorporé une UINavigationController dans mon contrôleur de vue. Je n'ai que quelques contrôleurs de vue pour lesquels je souhaite définir uniquement l'orientation portrait: cela signifie que la rotation de l'appareil ne doit pas faire pivoter ces contrôleurs de vue en mode paysage. J'ai essayé les solutions suivantes:

premier:

   NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationPortrait];
   [[UIDevice currentDevice] setValue:value forKey:@"orientation"];

mais l'écran tourne toujours en paysage.

Deuxièmement: J'ai créé une classe de contrôleur de vue personnalisée en tant que PortraitViewController et ajouté le code ci-dessous dans PortraitViewController.m

@interface PortraitViewController ()
@end

@implementation PortraitViewController
- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    //Here check class name and then return type of orientation
    return UIInterfaceOrientationMaskPortrait;
}
@end

Après cela, j'ai implémenté PortraitViewController.h en tant que classe de base

#import <UIKit/UIKit.h>
#import "PortraitViewController.h"
@interface Login : PortraitViewController
@end

Cela ne fonctionne pas du tout, permet toujours au contrôleur de vue de pivoter en mode paysage.

Existe-t-il une autre solution que j'utilise iOS 8 et ne souhaite pas que viewcontroller tourne en mode paysage?

EDIT: Est-il possible d'avoir une orientation Paysage uniquement pour certains contrôleurs de vue et d'obliger celle-ci à rester en mode Portrait?

11
TechGuy

Essayez de sous-classer la UINavigationController que vous utilisez car la valeur par défaut UINavigationController ne transfère pas la méthode shouldAutorotate à votre viewcontroller.

Implémentez la méthode suivante dans votre sous-classe UINavigationController

- (BOOL)shouldAutorotate
{
    return [self.visibleViewController shouldAutorotate];
}

Maintenant, la UINavigationController transfère l'appel de méthode à sa UIViewController visible actuelle. Vous devez donc implémenter shouldAutorotate individuellement pour obtenir l'effet souhaité.

7
JulianM

Essayez d'ajouter cette méthode avec shouldAutorotate et supportedInterfaceOrientations

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
//Setting the orientation of the view.  I've set it to portrait here.
return UIInterfaceOrientationPortrait;

}

Vous pouvez aussi utiliser ce [UIViewController attemptRotationToDeviceOrientation] pour qu’il tourne dans la nouvelle orientation souhaitée.

5
iPP

Votre PortraitViewController va bien et je ne connais pas votre configuration Storyboard. Dans votre cas, l’important est d’incorporer votre contrôleur de vue cible dans un autre nouveau contrôleur de navigation, puis de définir sa classe sur votre PortraitViewController et de présenter cette navigation de manière modale, comme je l’ai fait dans l’image ci-dessous et tout fonctionne comme prévu.

 enter image description here

Si vous souhaitez afficher une animation produisant une animation de présentation comme une animation Push

Ci-dessous se trouve la sous-classe Mine PortrateNavigation de UINavigationController.

PortrateNavigation.h

#import <UIKit/UIKit.h>

@interface PortrateNavigation : UINavigationController

@end

PortrateNavigation.m

#import "PortrateNavigation.h"

@implementation PortrateNavigation

- (void)viewDidLoad  {
    [super viewDidLoad];
}

- (BOOL)shouldAutorotate {
    return YES;
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

@end
5
Anand Suthar

Créez une catégorie sur la UINavigationController et remplacez supportedInterfaceOrientations

#import "UINavigationController+Orientation.h"

 @implementation UINavigationController (Orientation)

-(NSUInteger)supportedInterfaceOrientations
{
   return [self.topViewController supportedInterfaceOrientations];
}

-(BOOL)shouldAutorotate
 {
    return YES;
 }

@end  

Lorsque vous avez incorporé UINavigationController, les conteneurs ne demandent pas à leurs enfants de faire une rotation ou non

3
M.Alatrash

Tu dois le faire manuellement. Tous les contrôleurs de vue, dans ceux pour lesquels vous ne souhaitez pas faire pivoter la vue, implémentent la méthode suivante.

- (BOOL)shouldAutorotate
{
    return NO;
}
1
VRAwesome

1) Créez une variable bool dans votre AppDelegate. 

2) Puis copiez et collez le code ci-dessous dans AppDelegate.m (modifiez-le selon vos besoins)

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{NSLog(@"%d", [UIDevice currentDevice].orientation)

if (self.isLandscape == YES) //bool created in first step
{
    return  UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}

return UIInterfaceOrientationMaskPortrait;
}

3) Maintenant, copiez et collez le code ci-dessous dans la méthode viewWillAppear du contrôleur de vue pour lequel vous souhaitez forcer l'orientation.

[AppDelegate sharedAppDelegate].isLandscape = YES; //bool created in first step
 NSNumber *value1 = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeRight]; //change the orientation as per your requirement
[[UIDevice currentDevice] setValue:value1 forKey:@"orientation"];

4) Maintenant, avant d’appuyer sur ce contrôleur de vue, vous devez d’abord régler le booléen. Alors, disons que vous voulez pousser le contrôleur de vue ABC 

[AppDelegate sharedAppDelegate].isLandscape = YES;
[self.navigationController pushViewController:<ABC view controller instance> animated:NO];

J'espère que cela t'aides!!

1
Manish Verma

Tr ceci dans votre contrôleur de vue

- (BOOL)shouldAutorotate{
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationPortrait |
           UIInterfaceOrientationPortraitUpsideDown;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
    return UIInterfaceOrientationPortrait;
}
1
Raman soni
class ViewController: UIViewController {
    override func shouldAutorotate() -> Bool {
        return false
    }
}

Voici le lien vers le sujet: http://koreyhinton.com/blog/lock-screen-rotation-in-ios8.html

0
Pawel Molodkin

Si vous souhaitez désactiver temporairement la rotation automatique, évitez de manipuler les masques d'orientation à cette fin. À la place, substituez la méthode shouldAutorotate sur le contrôleur de vue initial. Cette méthode est appelée avant d’effectuer une autorotation. Si la réponse est NON, la rotation est supprimée.

Donc, vous devez sous-classe 'UINavigationController', implémenter devrait Autoriser et utiliser votre classe de contrôleur de navigation dans votre storyboard.

- (BOOL)shouldAutorotate

{

id currentViewController = self.topViewController;


 if ([currentViewController isKindOfClass:[DetailViewController class]])
    return NO;

return YES;

}

une autre approche peut être trouvée sur

http://www.sebastianborggrewe.de/only-make-one-single-view-controller-rotate/

0
Divjot Singh Sandhu