2011-02-01 7 views
5

Ho letto molto a riguardo. Le persone dicono che non eseguirà l'autorotazione quando il genitore non è impostato per la rotazione automatica. Ho provato tutto ma senza fortuna. Ho creato un'applicazione in base alla vista (v4.2) con un pulsante che esegue questo:iPhone UIActionSheet auto-rotante non funzionante

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]; 

Il controller principale è impostato per la rotazione automatica. Il foglio d'azione no. Notare che quando ruoto il simulatore non viene chiamato nessuno dei metodi di orientamento del controller di root. C'è un problema con il delegato? Che c'è?

+0

Provate ad usare 'showInTabbar' o' showFromBarButtonItem'. 'showInView' è un po 'stupido a volte. –

+0

No ... lo stesso, non in rotazione. – xpepermint

+0

Hai trovato una soluzione a questo problema. Sto affrontando lo stesso problema. –

risposta

6

Bene, ecco la mia soluzione a questo problema:

Fondamentalmente quello che facciamo è:

  1. ascoltare l'evento di rotazione.
  2. Ascolta l'evento click.
  3. Ignora l'actionSheet e presentalo di nuovo dopo aver eseguito la rotazione. (Abbiamo bisogno di aspettare un piccolo ritardo per consentire di prendere

ad esempio:.

@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]; 
} 
+1

è davvero grazie mille! – jin

+0

e gli orientamenti del dispositivo a faccia in su e a faccia in giù? –

1

ho scoperto che ero in esecuzione in questo problema quando ho presentato il foglio di azione in un delegato metodo da una vista subordinato (che avevo spinto mediante il controller di navigazione). il problema era che la mia vista non era quella corrente, la vista subordinato era ancora fino al punto in cui stavo cercando di mostrare il foglio azione.

Cambiando il mio codice un po 'in modo che il metodo delegato abbia preso nota dell'interazione ne modificato con l'utente e rimandando la presentazione del foglio di azione al metodo viewDidAppear di questa vista, il foglio appariva al momento giusto nell'animazione dell'interfaccia logica e il problema di rotazione automatica scompariva. Potresti voler vedere se questo ti aiuta.

In altre parole, il flusso è diventato:

  • vista subordinato chiamato metodo delegato per segnalare all'utente le scelte fatte al momento di lasciare.
  • La visualizzazione padre ha registrato queste informazioni per dopo.
  • È stato ordinato al controller di navigazione di escludere la visualizzazione secondaria.
  • Visualizzazione della vista padreDidLoad: il metodo ha rilevato la nota effettuata nel metodo delegato.
  • Foglio di azione presentato; la rotazione ora era corretta.