web-dev-qa-db-fra.com

Comprendre le changement d'orientation de l'interface iOS 6

ADDED: Je vois que ma question est affichée souvent sans vote positif, alors j’ai décidé que vous n’avez pas ce que vous cherchez. Cela vous redirige vers une question qui a vraiment bonne réponse à propos de Comment gérer les changements d'orientation dans iOS6

Exigences spécifiques concernant les changements d’orientation: Rotation restreinte

Les votes positifs sont les bienvenus :)


J'ai créé un nouveau projet à partir du modèle Master Detail et j'essaie de le démarrer avec l'orientation paysage. Comme vous le savez 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 

méthode est obsolète et nous devons utiliser 

- (NSUInteger)supportedInterfaceOrientations 

et/ou 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation

Voici mon code:

- (NSUInteger)supportedInterfaceOrientations {
    NSLog(@"supported called");
    return UIInterfaceOrientationMaskAll;//Which is actually a default value
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    NSLog(@" preferred called");//This method is never called. WHY?
    return UIInterfaceOrientationLandscapeRight;
}

Comme vous pouvez le constater, j'essaie de renvoyer l'orientation paysage dans la méthode préférée, mais elle ne s'appelle jamais. P.s. états de la documentation:

Discussion Le système appelle cette méthode lorsqu'il présente le contrôleur de vue En plein écran. Vous implémentez cette méthode lorsque votre contrôleur de vue Prend en charge deux orientations ou plus, mais que le contenu du fichier Correspond le mieux à l'une de ces orientations.

Si votre contrôleur de vue implémente cette méthode, alors, lorsqu'il est présenté, Sa vue est affichée dans l'orientation préférée (bien qu'il soit possible de faire pivoter Ultérieurement vers une autre rotation prise en charge). Si vous n'implémentez pas cette méthode , Le système présente le contrôleur de vue à l'aide de l'orientation Actuelle de la barre d'état.

La question est donc de savoir pourquoi la méthode prefferredOrientation n’est jamais appelée. Et comment devrions-nous gérer différentes orientations dans différents contrôleurs?. Merci! P.S ne marque pas la question en double. J'ai enquêté sur toutes les questions similaires et ils n'ont pas de réponse pour la mienne.

23
Stas

À propos de preferredInterfaceOrientationForPresentation

preferredInterfaceOrientationForPresentation n'est jamais appelé car il ne s'agit pas d'un contrôleur de vue "présenté". Il n'y a pas de "présentation" impliqué ici.

"Présentés" et "présentation" ne sont pas des termes vagues qui signifient "apparaît". Ce sont des termes techniques précis, signifiant que ce contrôleur de vue est mis en jeu avec l'appel presentViewController:animated:completion:. En d'autres termes, cet événement n'arrive que s'il s'agit de ce que nous appelions auparavant un contrôleur de vue "modal".

Eh bien, votre contrôleur de vue est not un contrôleur de vue modal; c'est not mis en jeu avec presentViewController:animated:completion:. Donc, il n'y a pas de "présentation" impliquée, et donc preferredInterfaceOrientationForPresentation n'est pas pertinent ici.

Je suis très explicite à ce sujet parce que je pense que beaucoup de gens seront confus ou induits en erreur de la même manière que vous. Alors peut-être que cette note les aidera.

Lancer dans le paysage

Dans iOS 6, la clé "Orientations d'interface prises en charge" dans votre Info.plist est prise beaucoup plus au sérieux qu'auparavant. La solution à votre problème global de lancement dans une orientation souhaitée est la suivante:

  1. Assurez-vous que les "Orientations d'interface prises en charge" dans vos listes Info.plist all orientations de votre application jamais seront autorisées à assumer.

  2. Assurez-vous que le lancement orientation souhaité est premier dans les "Orientations d'interface prises en charge".

C'est tout ce qu'on peut en dire. En fait, vous ne devriez pas avoir à insérer de code dans le contrôleur de vue racine pour gérer l'orientation initiale.

34
matt

Si vous souhaitez lancer l'affichage modal en mode Paysage, il suffit de mettre ce code dans le contrôleur de vue présenté

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    UIInterfaceOrientation orient = [[UIApplication sharedApplication] statusBarOrientation];
    if (UIInterfaceOrientationIsLandscape(orient)) {
        return orient;
    }

    return UIInterfaceOrientationLandscapeLeft;
}

Ensuite, présentez ce contrôleur comme d'habitude

UIViewController *vc = [[UIViewController alloc] initWithNibName:nil bundle:nil];
[vc setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
[vc setModalPresentationStyle:UIModalPresentationFullScreen];
[self.navigationController presentViewController:vc animated:YES completion:^{}];
8
FunkyKat

La réponse est très simple: vous pouvez uniquement modifier ou corriger l'orientation de l'interface d'un contrôleur de vue présenté modal. Si vous le faites, c’est-à-dire avec une séquence Present Modally dans Interface Builder (ou la méthode du contrôleur de navigation), vous pouvez définir les orientations autorisées avec

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait; // for example else an addition of all allowed
}

Cet événement ne se déclenche pas lorsque vous appuyez simplement sur un contrôleur de vue sur le contrôleur de navigation ... donc: vous n’avez pas de bouton RETOUR et avez besoin d’un 

[self dismissViewControllerAnimated:YES completion: ^(void) {

    }];

pour la fermer.

0
Tintenklecks