web-dev-qa-db-fra.com

iOS 8 UIActionSheet ignore les contrôleurs de vue pris en charge dans les InterfaceOrientations et devrait Autoriser

J'ai une application configurée via le fichier plist pour prendre en charge les orientations portrait, paysage gauche et paysage droit (c'est-à-dire UISupportedInterfaceOrientations a la valeur UIInterfaceOrientationPortrait, UIInterfaceOrientationLandscapeLeft et UIInterfaceOrientationLandscapeRight). Mais j'ai limité les orientations prises en charge à un portrait dans un contrôleur de vue. Si je présente une feuille UIActionSheet sur la vue du contrôleur de vue, puis que je fais pivoter le périphérique, la feuille UIActionSheet effectue une rotation vers la nouvelle orientation. Cela se produit uniquement sur les appareils exécutant iOS 8 (GM Seed).

Je voudrais que UIActionSheet respecte les règles du contrôleur de vue contenant et ne tourne pas. Pensées?

Je ne veux pas que cela se produise: capture d'écran http://oi58.tinypic.com/20tgto2.jpg

Exemple de code UIViewController:

- (IBAction)onTouch:(id)sender
{
    UIActionSheet * actionSheet = [[UIActionSheet alloc] initWithTitle:@"hi"
                                                       delegate:nil
                                              cancelButtonTitle:@"Cancel"
                                         destructiveButtonTitle:nil
                                              otherButtonTitles:@"Open", nil];

    [actionSheet showInView:self.view];
}

#pragma mark - Rotation methods

- (BOOL)shouldAutorotate
{
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}
23
Awesomeness

A été informé que UIAlertController remplace UIActionSheet dans iOS 8.

"La nouvelle classe UIAlertController remplace les classes UIActionSheet et UIAlertView comme moyen privilégié d’affichage des alertes dans votre application."

https://developer.Apple.com/library/prerelease/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS8.html

UIAlertController * alertController = [UIAlertController alertControllerWithTitle:@"hi"
                                                                          message:nil
                                                                   preferredStyle:UIAlertControllerStyleActionSheet];

[alertController addAction:[UIAlertAction actionWithTitle:@"Open"
                                                  style:UIAlertActionStyleDefault
                                                handler:^(UIAlertAction *action) {
                                                   // open something
                                                }]];

[alertController addAction:[UIAlertAction actionWithTitle:@"Cancel"
                                                  style:UIAlertActionStyleCancel
                                                handler:nil]];

[self presentViewController:alertController animated:YES completion:nil];
5
Awesomeness

Voici ma solution de contournement basée sur la solution de Busrod avec quelques modifications car j'ai eu quelques problèmes dans UIActionSheet lors de l'utilisation de sa solution de contournement:

-(UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    UIViewController *presentedViewController = window.rootViewController.presentedViewController;
    if (presentedViewController) {
        if ([presentedViewController isKindOfClass:[UIActivityViewController class]] || [presentedViewController isKindOfClass:[UIAlertController class]]) {
            return UIInterfaceOrientationMaskPortrait;
        }
    }
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}
21
StuckOverFlow

Ajout à la réponse de @ user3750435

Puisque le PO a défini les masques de rotation qu'il/elle veut dans le Info.plist, nous n'avons pas besoin de redéfinir les masques ici. UIApplication peut nous retourner ces masques via supportéInterfaceOrientationsForWindow: . Donc, la méthode peut être simplifiée comme ceci:

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    UIViewController *presentedViewController = window.rootViewController.presentedViewController;
    if (presentedViewController) {
        if ([presentedViewController isKindOfClass:[UIActivityViewController class]] || [presentedViewController isKindOfClass:[UIAlertController class]]) {
            return UIInterfaceOrientationMaskPortrait;
        }
    }
    return [application supportedInterfaceOrientationsForWindow:window];
}
0
Ayush Goel

- application (NSUInteger): (UIApplication *) application soutenueInterfaceOrientationsForWindow: (UIWindow *) fenêtre {

UIViewController *presentedViewController = window.rootViewController.presentedViewController;
if (presentedViewController) {
    if ([presentedViewController isKindOfClass:[UIActivityViewController class]] || [presentedViewController isKindOfClass:[UIAlertController class]]) {
        return UIInterfaceOrientationMaskPortrait;
    }
}
return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;

}

merci cela a fonctionné pour moi

0
Ashish Khobragade