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?
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).
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,
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
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.
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)
}
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