2010-09-22 11 views
6

Ho un'app di navigazione che ha una vista dettagliata (UIWebView) con pulsanti di azione sul fondo in una UIToolbar. Voglio aggiungere "note" quando viene premuto il pulsante "note". Tutto funziona correttamente quando la visualizzazione Web è in modalità verticale. Premendo il pulsante delle note, la vista modale si apre bene e funziona alla grande.Modal View Controller non si avvierà in modalità orizzontale

Il problema si verifica quando la visualizzazione Web è in modalità orizzontale. Se premo il pulsante delle note, viene chiamato tutto il codice per aprire la vista modale, ma tutto ciò che ottengo è una schermata bianca. Un commento: se apro la vista modale in verticale e quindi ruoto il dispositivo, ruota correttamente in modalità orizzontale. Semplicemente non sarà aprire correttamente in modalità orizzontale.

Ho un altro pulsante che visualizza il compositore di posta che ha lo stesso comportamento. Ecco il codice nel mio UIWebViewController:

- (IBAction)addNotes:(id)sender 
{ 
    NotesViewController *notesViewController; 

    // create the view controller and set it as the root view of a new navigation 
    // controller 

    notesViewController = [[NotesViewController alloc] initWithPrimaryKey:self.record.primaryKey]; 
    UINavigationController *newNavigationController = 
    [[UINavigationController alloc] initWithRootViewController:notesViewController]; 

    // present the navigation controller modally 

    [self presentModalViewController:newNavigationController animated:YES]; 
    [notesViewController release]; 
    [self.view setNeedsDisplay]; // not sure if I need this! I was trying different things... 
    [self.devotionText setNeedsDisplay]; // ditto... 
    [newNavigationController release]; 
} 

Qualche idea? Ho provato ogni sorta di cose diverse senza successo. Ho appena ottenuto una schermata bianca senza barra di navigazione (anche se c'è una barra di stato in alto).

+0

Sei sul sistema operativo più recente? Ho avuto problemi con l'attivazione di una vista modale solo orizzontale mentre in verticale su 3.1.3 ... –

+0

Sì, sto utilizzando l'SDK 4.0 ... – Glasswing

risposta

-1

Non è necessario un nuovo Navigation Controlle r.

- (IBAction)addNotes:(id)sender { 

NotesViewController *notesViewController; 

// create the view controller and set it as the root view of a new navigation 
// controller 

notesViewController = [[NotesViewController alloc] initWithPrimaryKey:self.record.primaryKey]; 

[self.navigationController pushViewController: notesViewController animated: YES]; 
[notesViewController release]; 
} 
+0

Ho rimosso il controller di navigazione e sto ancora ottenendo lo stesso comportamento. Grazie mille per aver risposto. Altre idee? – Glasswing

7

I moduli non ricevono sempre informazioni sulle rotazioni e ricevono le informazioni dalla barra di stato, che non sempre funziona correttamente. Metti questo nella tua viewWillAppear per risolvere: [UIApplication sharedApplication].statusBarOrientation = self.interfaceOrientation E, se vuoi un controller di navigazione all'interno del tuo modal, devi crearne uno.

Inoltre, non è necessario setNeedsDisplay. Ciò influenza solo le visualizzazioni correnti, non la modale che stai presentando.

+0

Grazie per aver risposto così in fretta! Ho provato a inserire il codice statusBarOrientation nella mia vista NotesViewControllerWillAppear e ho ancora lo stesso comportamento! Ho anche rimosso il nuovo controller di navigazione e ancora non ottengo nulla ... solo lo schermo bianco. Qualche altro suggerimento? – Glasswing

+0

Puoi pubblicare del codice per la funzione initWithPrimaryKey? Pubblicare un po 'di codice su quel file ti aiuterà immensamente! – MishieMoo

+0

La funzione init è semplice ... il file xib è solo un UIView con un UITextView sotto di esso. – Glasswing

2

Wow, ho perso giorni su quel problema ... ma ho trovato una soluzione!

Ho avuto lo stesso problema che avevi: il metodo "presentModalViewController: animated:" funzionava solo in modalità verticale.

Dopo un sacco di tentativi ed errori, ho scoperto che il motivo era che avevo diversi controller di visualizzazione attivi allo stesso tempo. Ho implementato un sistema di navigazione che cambiava tra diversi controller di visualizzazione, con un genitore che gestiva i bambini. (Non ho potuto utilizzare UINavigationController, perché avevo bisogno di un aspetto diverso.)

Quindi, il mio controller di visualizzazione radice aveva un oggetto di visualizzazione radice e diversi controller di vista figlio. Quando è stato attivato un controller di visualizzazione figlio, il relativo oggetto di visualizzazione è stato aggiunto come sottoview alla vista del controller di visualizzazione radice.

Il metodo "presentModalViewController" non è piaciuto. Tuttavia, non appena ho impostato la proprietà "parentViewController" dei controller di visualizzazione figlio, ha funzionato!

Il problema è solo che "parentViewController" è una proprietà di sola lettura. Devi estendere la classe UIViewController in modo che tu possa accedervi.

@interface UIViewController (HelperExtension) 

@property (nonatomic, assign) UIViewController *parent; 

@end 

@implementation UIViewController (HelperExtension) 

- (UIViewController *)parent 
{ 
    return self.parentViewController; 
} 

- (void)setParent:(UIViewController *)parent 
{ 
    [self setValue:parent forKey:@"_parentViewController"]; 
} 

@end 

Così, ogni volta si aggiunge la vista di un controller della vista bambino al controller vista primaria, chiamare il "setParent:" Metodo dopo farlo. Allora funzionerà!

+0

Questo ha funzionato anche per me. Non stavi usando BCTabBarController da nessun cambiamento, vero? Così tanti problemi per quelle piccole frecce Animating ... –

2

Si è verificato lo stesso problema quando si presenta modally un controller di navigazione.Assicuratevi di avere correttamente implementare: shouldAutorotateToInterfaceOrientation

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
{ 
    BOOL shouldAutorotate = NO; 
    if(isControllerMangingAllOrientations) 
    { 
     shouldAutorotate = YES; 
    } 
    else 
    { 
     shouldAutorotate = (toInterfaceOrientation == UIInterfaceOrientationPortrait); 
    } 
    return shouldAutorotate; 
} 

stavo installando il booleano nel metodo viewDidLoad, non è una buona idea. Mettendolo in initWithNibName: bundle: metodo è il posto giusto.

+0

combattere con questo problema esatto e si è dimenticato che XCode impostazione predefinita è l'aggiunta di 4: '- (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation { ritorno (interfaceOrientation == UIInterfaceOrientationPortrait); } Non c'è da stupirsi che fosse sempre ritratto .... * sospiro * –

0

Se si utilizza presentModalViewController solo per l'animazione come me, è possibile utilizzare pushViewController con l'animazione, come di seguito risposta;

Showing pushviewcontroller animation look like presentModalViewController

e si può chiudere la viewController come sotto;

CATransition* transition = [CATransition animation]; 
transition.duration = 0.3; 
transition.type = kCATransitionFade; 
transition.subtype = kCATransitionFromTop; 

[self.navigationController.view.layer addAnimation:transition forKey:kCATransition]; 
[self.navigationController popViewControllerAnimated:NO]; 

Speranza che aiuta ..

0

ho avuto il compito di mostrare un lettore video in modalità orizzontale.

AVPlayerViewController *playerViewController = [AVPlayerViewController new]; 
//Player init code goes here.... 

// #define degreesToRadian(x) (M_PI * (x)/180.0) - was defined previously in a class header 

playerViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; 
playerViewController.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90)); 
playerViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height); 

[self presentViewController:playerViewController animated:YES completion:nil]; 
Problemi correlati