5 votes

L'auto-rotation de UIActionSheet pour iPhone ne fonctionne pas

J'ai lu beaucoup de choses à ce sujet. Les gens disent qu'il ne s'autorotationne pas lorsque son parent n'est pas configuré pour s'autorotationner. J'ai tout essayé, mais sans succès. J'ai créé une application basée sur la vue (v4.2) avec un bouton qui exécute ceci :

    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"Title" delegate:self cancelButtonTitle:@"Cancel Button" destructiveButtonTitle:@"Destructive Button" otherButtonTitles:@"Other Button 1", nil];
    actionSheet.actionSheetStyle = UIActionSheetStyleBlackOpaque;
    [actionSheet showInView:self.view];

Le contrôleur Root est réglé sur l'auto-rotation. La feuille d'action ne l'est pas. Notez que lorsque je fais pivoter le simulateur, aucune des méthodes d'orientation du contrôleur racine n'est appelée. Y a-t-il un problème avec le délégué ? Quel est le problème ?

6voto

Lirik Points 531

Eh bien, voici ma solution à ce problème :

En gros, ce que nous faisons est :

  1. Écoutez l'événement de rotation.
  2. Écouter l'événement de clic.
  3. Fermez la feuille d'action et présentez-la à nouveau une fois la rotation effectuée. (nous devons attendre un petit délai pour que cela prenne.

par exemple :

@interface ViewController ()
{
    UIActionSheet *_sheet;
    BOOL _isClicked;
}
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:) name:UIDeviceOrientationDidChangeNotification object:nil];
}

- (IBAction)click:(id)sender
{
    _isClicked = YES;

    [self showActionSheet];
}

- (void)didRotate:(NSNotification *)note
{
    [_sheet dismissWithClickedButtonIndex:1 animated:YES];
    [self performSelector:@selector(showActionSheet) withObject:nil afterDelay:1.0];
}

- (void)showActionSheet
{
    if (!_isClicked) return;

    _sheet = [[UIActionSheet alloc] initWithTitle:@"title" delegate:self cancelButtonTitle:@"cancel" destructiveButtonTitle:@"new" otherButtonTitles:@"bla", nil];
    [_sheet showInView:self.view];
}

1voto

James Elliott Points 136

J'ai découvert que je rencontrais ce problème lorsque je présentais la feuille d'action dans une méthode déléguée à partir d'une vue subordonnée (que j'avais poussée en utilisant le contrôleur de navigation). Le problème était que ma vue n'était pas la vue courante, la vue subordonnée était toujours en place au moment où j'essayais de montrer la feuille d'action.

En modifiant légèrement mon code pour que la méthode delegate prenne note de l'interaction nécessaire avec l'utilisateur, et en reportant la présentation de la feuille d'action à la méthode viewDidAppear de cette vue, la feuille est apparue au bon moment dans l'animation de l'interface logique, et le problème d'auto-rotation a disparu. Vous voudrez peut-être voir si cela vous aide.

En d'autres termes, le flux est devenu :

  • La vue subordonnée a appelé la méthode déléguée pour signaler les choix faits par l'utilisateur lors de son départ.
  • La vue des parents a enregistré ces informations pour plus tard.
  • On a dit au contrôleur de navigation d'enlever la vue subordonnée.
  • La méthode viewDidLoad : de la vue parent a détecté la remarque faite dans la méthode delegate.
  • La feuille d'action a été présentée ; la rotation est maintenant correcte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X