web-dev-qa-db-fra.com

Un seul mode paysage ONE VIEW

J'ai terminé mon application iOS, mais je dois définir une seule vue en mode paysage, les autres vues ne peuvent être vues qu'en mode portrait.

J'utilise Xcode 5.1 et j'ai créé toutes mes vues en déposant mes contrôleurs de vue de storyboard dans le panneau de droite, donc si vous allez me dire d'écrire du code quelque part, dites-moi exactement où je dois l'écrire.

J'ai lu une solution ici INavigationController Force Rotate mais je ne sais pas où écrire ce code. Dois-je en créer un UIViewController manuellement?

37
maeq

Je suppose que vous ciblez iOS 7 ici (en utilisant XCode 5.1, je pense avoir raison).

Tout d'abord, vous devez comprendre que pour ouvrir une seule vue sur plus de 40 en mode paysage, votre application doit autoriser les orientations d'interface paysage et portrait. C'est le cas par défaut, mais vous pouvez le vérifier dans les paramètres de votre cible, General tab, Deployment Info section (voir capture d'écran ci-dessous).

enter image description here

Ensuite, comme vous avez autorisé à la fois le paysage et le portrait pour l'ensemble de l'application, vous devrez dire à chaque UIViewController uniquement en mode portrait qu'il ne doit pas tourner automatiquement, en ajoutant l'implémentation de cette méthode:

- (BOOL)shouldAutorotate {
  return NO;
}

Enfin, pour votre contrôleur paysage uniquement spécifique, et parce que vous avez dit que vous le présentiez de manière modale, vous pouvez simplement implémenter ces méthodes:

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
  return UIInterfaceOrientationLandscapeLeft; // or Right of course
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
  return UIInterfaceOrientationMaskLandscape;
}

J'espère que cela vous aidera,

38
Zedenem

rapide

AppDelegate.Swift

internal var shouldRotate = false
func application(_ application: UIApplication,
                 supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    return shouldRotate ? .allButUpsideDown : .portrait
}

Votre contrôleur de paysage

let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.shouldRotate = true // or false to disable rotation

Objectif-C

AppDelegate.h

@property (assign, nonatomic) BOOL shouldRotate;

AppDelegate.m

- (UIInterfaceOrientationMask)application:(UIApplication *)application
 supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    return self.shouldRotate ? UIInterfaceOrientationMaskAllButUpsideDown
                             : UIInterfaceOrientationMaskPortrait;
}

Votre contrôleur de paysage

AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
[appDelegate setShouldRotate:YES]; // or NO to disable rotation
89
Yaroslav

Pour assurer le suivi de la solution de Yaroslav, afin de permettre la rotation en mode paysage sur une seule vue, le contrôleur de vue paysage devrait avoir la valeurRotate définie sur OUI dans sa méthode viewWillAppear et sur NON dans sa vueWillDisappear.

Si vous définissez uniquementShouldRotate sur YES dans viewWillAppear, une fois ce contrôleur de vue existant, tous les autres contrôleurs de vue seront également pivotés. Ainsi, vous devez définirShouldRotate sur NO dans sa vueWillDisappear pour empêcher la rotation de la vue portrait.

6
Tim Le

Swift4

Ajoutez les lignes de code ci-dessous à votre AppDelegate

var orientationLock = UIInterfaceOrientationMask.portrait

    func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
        return self.orientationLock
    }

    struct AppUtility {
        static func lockOrientation(_ orientation: UIInterfaceOrientationMask) {
            if let delegate = UIApplication.shared.delegate as? AppDelegate {
                delegate.orientationLock = orientation
            }
        }

        static func lockOrientation(_ orientation: UIInterfaceOrientationMask, andRotateTo rotateOrientation:UIInterfaceOrientation) {
            self.lockOrientation(orientation)
            UIDevice.current.setValue(rotateOrientation.rawValue, forKey: "orientation")
        }
    }

Ajoutez le code ci-dessous au contrôleur que vous souhaitez aménager

override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewWillAppear(_ animated: Bool) {
        AppDelegate.AppUtility.lockOrientation(UIInterfaceOrientationMask.landscapeRight, andRotateTo: UIInterfaceOrientation.landscapeRight)
    }

    override func viewWillDisappear(_ animated : Bool) {
        super.viewWillDisappear(animated)
        AppDelegate.AppUtility.lockOrientation(UIInterfaceOrientationMask.portrait, andRotateTo: UIInterfaceOrientation.portrait)
    }
6
Bhavesh Patel

Vous devez déclarer shouldRotate comme interne pour vous débarrasser de la propriété publique dans aucun avertissement de classe publique. internal var shouldRotate = false

1
bleft