2010-09-22 9 views
6

Ich habe eine navigationsbasierte App mit einer Detailansicht (UIWebView) mit Aktionsschaltflächen am unteren Rand einer UIToolbar. Ich möchte 'Notizen' hinzufügen, wenn die Taste 'Notizen' gedrückt wird. Alles funktioniert gut, wenn die Webansicht im Hochformat ist. Ich drücke den Notenknopf, die modale Ansicht öffnet sich gut und funktioniert super.Modal View Controller startet nicht im Landscape-Modus

Das Problem tritt auf, wenn sich die Webansicht im Querformat befindet. Wenn ich die Notizen-Taste drücke, wird der gesamte Code zum Öffnen der modalen Ansicht aufgerufen, aber alles, was ich bekomme, ist ein weißer Bildschirm. Ein Kommentar: Wenn ich die modale Ansicht im Hochformat öffne und das Gerät dann drehe, dreht es sich gut in den Querformat-Modus. Es wird einfach nicht im Querformat korrekt öffnen.

Ich habe eine andere Schaltfläche, die den Mail-Composer, der das identische Verhalten hat, auftaucht. Hier ist der Code in meinem 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]; 
} 

Irgendwelche Ideen? Ich habe alle möglichen Dinge ausprobiert, ohne Erfolg. Ich bekomme nur einen weißen Bildschirm ohne Navigationsleiste (obwohl oben eine Statusleiste angezeigt wird).

+0

Sind Sie auf dem neuesten Betriebssystem? Ich hatte Probleme mit dem Drücken einer Landscape-only modalen Ansicht im Portrait auf 3.1.3 ... –

+0

Ja, ich bin mit dem 4.0 SDK ... – Glasswing

Antwort

-1

Sie benötigen keine neue Navigation Controlle r.

+0

Ich habe den Navigationscontroller entfernt und bekomme immer noch das gleiche Verhalten. Vielen Dank für Ihre Antwort. Irgendwelche anderen Ideen? – Glasswing

7

Modale erhalten nicht immer Informationen über Rotationen, und sie erhalten ihre Informationen von der Statusleiste, die nicht immer richtig funktioniert. Setzen Sie dies in Ihrem ViewWillAppear, um zu beheben: [UIApplication sharedApplication].statusBarOrientation = self.interfaceOrientation Und wenn Sie einen Navigationscontroller in Ihrem Modal möchten, müssen Sie einen erstellen.

Sie brauchen auch nicht das setNeedsDisplay. Das betrifft nur die aktuellen Ansichten, nicht das Modal, das Sie präsentieren.

+0

Danke für die Antwort so schnell! Ich habe versucht, den statusBarOrientation Code in meine NotesViewController viewWillAppear zu setzen und ich bekomme immer noch das gleiche Verhalten! Ich habe auch den neuen Navigationscontroller entfernt und bekomme trotzdem nichts ... nur den weißen Bildschirm. Irgendwelche anderen Vorschläge? – Glasswing

+0

Können Sie Code für die Funktion initWithPrimaryKey posten? Das Posten eines Codes für diese Datei wird sehr hilfreich sein! – MishieMoo

+0

Die init-Funktion ist einfach ... die XIB-Datei ist nur eine UIView mit einem UITextView darunter. – Glasswing

2

Wow, ich verlor Tage über dieses Problem ... aber ich fand eine Lösung!

Ich hatte das gleiche Problem, das Sie hatten: Die Methode "presentModalViewController: animiert:" funktionierte nur im Hochformat.

Nach viel Versuch und Irrtum fand ich heraus, dass der Grund dafür war, dass ich mehrere View-Controller zur gleichen Zeit aktiv hatte. Ich implementierte ein Navigationssystem, das zwischen verschiedenen View-Controllern wechselte, wobei ein Elternteil die Kinder behandelte. (Ich konnte UINavigationController nicht verwenden, weil ich ein anderes Aussehen brauchte.)

So hatte mein Root-View-Controller ein Root-View-Objekt und mehrere untergeordnete View-Controller. Wenn ein untergeordneter Ansichtscontroller aktiviert wurde, wurde sein Ansichtsobjekt als Unteransicht zur Ansicht des Stammansicht-Controllers hinzugefügt.

Die "presentModalViewController" -Methode hat das nicht gefallen. Sobald ich jedoch die "parentViewController" -Eigenschaft der Child-View-Controller gesetzt habe, funktionierte es!

Das Problem ist nur, dass "ParentViewController" eine schreibgeschützte Eigenschaft ist. Sie müssen die UIViewController-Klasse erweitern, damit Sie darauf zugreifen können.

@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 

Also, wenn Sie die Ansicht eines Kindes View-Controller zu Ihren Eltern-View-Controller hinzuzufügen, rufen Sie die „setParent:“ Verfahren, nachdem es zu tun. Dann wird es funktionieren!

+0

Das hat auch bei mir funktioniert. Du hast BCTabBarController bei keiner Änderung benutzt, oder? So viel Mühe für die kleinen Pfeile belebende ... –

2

Das gleiche Problem, wenn modal eine Navigation Controller präsentiert.Achten Sie darauf, richtig zu haben, implementieren: ShouldAutorotateToInterfaceOrientation

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

ich die boolean in der viewDidLoad Methode Einstellung, keine gute Idee. Putting es in der InitWithNibName: Bundle: Methode ist der richtige Ort.

+0

mit genau diesem Problem zu kämpfen und vergessen, dass standardmäßig XCode 4 ergänzt: '- (BOOL) ShouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation { return (interfaceOrientation == UIInterfaceOrientationPortrait); } ' Kein Wunder, es war immer Porträt .... * seufz * –

0

Wenn Sie PresentModalViewController nur für Animation wie ich verwenden, können Sie mit Pushviewcontroller Animation wie unten Antwort verwenden können;

Showing pushviewcontroller animation look like presentModalViewController

und Sie können die Viewcontroller, wie unten schließen;

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

Hoffe, es hilft ..

0

ich die Aufgabe, einen Video-Player im Querformat zu zeigen hatte.

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