Comment puis-je définir par programme d'orientation de l'écran sous iOS 7?
Je suis en train de travailler sur une application iPad, en utilisant la mise en page automatique, où, si l'utilisateur active un certain mode ("heads-up") de mode, je veux soutenir uniquement en mode portrait (portrait ou à l'envers) l'orientation, et de plus, si l'appareil est en mode paysage, j'aimerais passer automatiquement en mode portrait.
Dans le top view controller, j'ai le texte suivant:
- (NSUInteger) supportedInterfaceOrientations {
if (self.modeHeadsUp) {
return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
} else {
return UIInterfaceOrientationMaskAll;
}
}
- (BOOL) shouldAutorotate {
return TRUE;
}
Basée sur les réponses que j'ai vu ailleurs, ici, la réponse semble être que je devrais utiliser l'application "setStatusBarOrientation". Par conséquent, dans la méthode où l'utilisateur a sélectionné le "heads-up" mode, j'ai inclus:
UIApplication *application = [UIApplication sharedApplication];
[application setStatusBarOrientation:UIInterfaceOrientationPortrait
animated:YES];
Toutefois, cela ne veut tout simplement semblent pas faire quoi que ce soit. Bien que je ne peux déplacer physiquement le périphérique pour obtenir de la faire pivoter en mode portrait, il ne le fait pas automatiquement.
En fait, lorsqu'en mode paysage après l'exécution du code ci-dessus pour tenter de définir par programmation de l'orientation, quand j'ai une requête à l'application "statusBarOrientation" avec le code suivant, il reste à "4" pour le paysage:
UIApplication *application = [UIApplication sharedApplication];
int orientation = [application statusBarOrientation];
self.movesTextView.text = [NSString stringWithFormat:@"ORIENTATION %d", orientation];
Il semblait comme peut-être la mise en page automatique n'a pas été déclenchée avec la setStatusBarOrientation, j'ai donc tenté d'ajouter ce code après avoir, à aucun effet:
[super updateViewConstraints];
[self.view updateConstraints];
Je me rends compte Apple veut laisser l'appareil à l'orientation dans les mains de l'utilisateur. Cependant, je voudrais être en mesure de prendre en charge paysage lorsqu'il n'est pas "heads-up" de mode.
Me manque quelque chose pour être en mesure à la force de changement d'orientation?
Vous devez vous connecter pour publier un commentaire.
Pour iOS 7 & 8:
Objective-C:
Swift 3+:
Je l'appelle dans
- viewDidAppear:
.De l'utiliser. Solution parfaite au problème d'orientation..ios7 et plus tôt
Vous devez appeler
attemptRotationToDeviceOrientation (UIViewController)
pour rendre le système d'appel de votresupportedInterfaceOrientations
lorsque l'état de santé a changé.UIViewController
s'orientationCela fonctionne pour moi sur
Xcode
6 & 5.ne fonctionne pas mais vous devez retourner shouldAutorotate OUI dans votre vue-contrôleur
Mais si vous le faites, votre VC va tourner automatiquement si l'utilisateur fait pivoter l'appareil...
donc je l'ai changé pour:
et j'appelle
pour forcer une nouvelle orientation avec un clic de bouton.
Pour définir l'arrière shouldAutoRotate PAS, j'ai ajouté à mon rootVC
PS: Cette solution de contournement ne fonctionne dans tous les simulateurs de trop.
La seule façon qui ont travaillé pour moi, c'est la présentation de mannequin modal-vue-contrôleur.
Votre VC sera demandé pour la mise à jour de l'interface orientations lorsque modal-vue-contrôleur est rejeté.
Curieux, c'est que UINavigationController est exactement ce que lors de la poussée/popping enfant de voir les contrôleurs avec différentes prises en charge de l'interface orientations (testé sur iOS 6.1, 7.0).
Cette solution vous permet de forcer une certaine interface d'orientation, temporairement par la substitution de la valeur de
UIDevice.current.orientation
et puis en demandant au système de rotation de l'interface pour correspondre à l'appareil de rotation:Important: C'est un hack, et pourrait cesser de fonctionner à tout moment
Ajoutez la ligne suivante dans votre application vue de la racine de contrôleur:
Assurez-vous que toutes les interface orientations sont contrôlés en vertu de Déploiement "Info":
Interface de demande de modifications d'orientation où vous en avez besoin:
Si vous souhaitez verrouiller l'écran principal de votre application en mode portrait, mais souhaitez ouvrir popup points de vue dans le paysage, et que vous utilisez tabBarController comme rootViewController comme je suis, vous pouvez utiliser ce code sur votre AppDelegate.
AppDelegate.h
AppDelegate.m
Il fonctionne très bien.
Dans votre viewController vous voulez être présentés dans le paysage, vous utilisez simplement la suivante:
UINavigationController
ouUITabBarController
intégré, donc c'est peut-être un peu de différence autrement.Ajouter cette déclaration dans
AppDelegate.h
Écrire cette section de code dans
AppDelegate.m
Changer le
allowRotation
propriété de délégué applicationSi vous avez un UIViewController qui doit rester en mode Portrait, il suffit d'ajouter cette substitution, et vous êtes tous ensemble.
La meilleure partie est qu'il ya pas d'animation lors de ce point de vue est montré, c'est juste dans la bonne orientation.
La base UINavigationController devrait avoir le dessous de rappel, de sorte que les éléments enfant peut décider de l'orientation qu'ils veulent.
Si vous souhaitez uniquement en mode portrait, dans iOS 9 (Xcode 7), vous pouvez:
J'ai été dans le même problème que vous. J'ai besoin d'un dispositif de verrouillage d'orientation pour certains écrans (comme Login) et permettre la rotation dans d'autres.
Après quelques changements et à la suite de certaines réponses ci-dessous, je l'ai fait par:
shouldAutorotate
méthode dans ce VC:-(BOOL)shouldAutorotate{
return NO;
}
Espère que cela fonctionnera pour vous.
ici, c'est un TRAVAIL COMPLET exemple pour iOS 7, 8, 9, 10 comment changer d'application de l'orientation actuelle l'opposé
Objective-C
Swift 3
"orientation"
n'est pas bon.UIDevice
'sorientation
propriété est prête seule. Avez-vous fait face à un rejet de l'application de ce code jamais?Essayez ceci avec votre code.
une fois à l'utilisateur de sélectionner une option, puis appeler cette méthode, car l'utilisateur peut être en mode paysage, et alors on peut définir uniquement en mode portrait, dans la même vue-contrôleur automatiquement à vue doit être déplacé en mode portrait, ainsi que le bouton d'acton appel de cette
[self willRotateToInterfaceOrientation:UIInterfaceOrientationPortrait duration:ROTATE_VIEW_DELAY];
à la méthode où le heads-up mode est sélectionné, le remplacement de Sunny Shah objc_msgSend réponse ci-dessus. Hélas, toujours pas d'effet sur l'affichage. C'est ma compréhension que "willrotate" est appelé lors de l'affichage est sur le point de tourner, en réponse à l'utilisateur de déplacer physiquement l'appareil.@property (nonatomic) bool modePortraitOnly;
- (NSUInteger) supportedInterfaceOrientations { if (self.modePortraitOnly) { return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; } else { return UIInterfaceOrientationMaskAll; } }
et lors de changements de contrôle, je n'ai tout simplement ` [auto willRotateToInterfaceOrientation:UIInterfaceOrientationPortrait durée:1.0]; " mais comme vous pouvez le voir si vous l'essayez, il ne fait rien. Commenter cette ligne et ajouter Sunny shah ci-dessus et il fonctionne.Ce travaille me parfaitement....
Pour ceux comme moi qui ont lutté pour obtenir @Sunny Shah accepté de répondre à de travail sur les iPads. Vous devez définir le "plein écran" case à cocher dans les réglages du projet. Notez que cela permettra d'éviter votre application de fonctionner sur le mode multitâche qui peut être ou ne pas être acceptable.