Frage

Ich habe auf Xcode 4.2 aktualisiert und es handelt sich um neue Storyboards. Es konnte jedoch keinen Weg finden, sowohl Porträt als auch Landschaft zu unterstützen.

Natürlich habe ich es programmgesteuert mit 2 Ansichten, einer für Porträt und einer für Landschaft, wie in alten Zeiten und:

if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight) 
    {
        self.view = self.landscapeView;
    }
    else
    {
        self.view = self.portraitView;
    }

Aber ich suchte nach einer Möglichkeit, dies automatisch irgendwie zu tun. Ich meine, es ist Xcode 4.2 jetzt, ich habe mehr davon erwartet. Vielen Dank an alle.

==================================
VORÜBERGEHENDE LÖSUNG:

Ich werde hier eine vorübergehende Lösung präsentieren. Ich sage, es ist vorübergehend, weil ich immer noch darauf warte, dass Apple -Leute etwas wirklich Intelligentes tun.

Ich habe eine andere .Storyboard -Datei mit dem Namen "Mainstoryboard_iphone_landscape" erstellt und die Landschaftsansichts -Controller dort implementiert. Tatsächlich ist es genau wie normal (Porträt) .Storyboard, aber alle Bildschirme befinden sich im Landschaftsmodus.

Deshalb werde ich den ViewController aus dem Landschafts -Storyboard extrahieren und wenn Rotation eintritt, ändern Sie einfach das Selbst. View mit der neuen ViewController -Ansicht.

1. Generieren Benachrichtigungen, wenn sich die Orientierung ändert:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

2. Schauen Sie sich Benachrichtigungen an:

[[NSNotificationCenter defaultCenter] addObserverForName:UIDeviceOrientationDidChangeNotification object:nil queue:nil usingBlock:^(NSNotification *note) {    
    // We must add a delay here, otherwise we'll swap in the new view  
    // too quickly and we'll get an animation glitch  
    [self performSelector:@selector(updateLandscapeView) withObject:nil afterDelay:0];
}];

3.Implement UpdateLandScapeView

- (void)updateLandscapeView {  
 //>     isShowingLandscapeView is declared in AppDelegate, so you won't need to declare it in each ViewController
 UIDeviceOrientation deviceOrientation       = [UIDevice currentDevice].orientation;
 if (UIDeviceOrientationIsLandscape(deviceOrientation) && !appDelegate().isShowingLandscapeView)
 {
     UIStoryboard *storyboard                = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone_Landscape" bundle:[NSBundle mainBundle]];
     MDBLogin *loginVC_landscape             =  [storyboard instantiateViewControllerWithIdentifier:@"MDBLogin"];
     appDelegate().isShowingLandscapeView    = YES;  
     [UIView transitionWithView:loginVC_landscape.view duration:0 options:UIViewAnimationOptionTransitionCrossDissolve|UIViewAnimationCurveEaseIn animations:^{
         //>     Setup self.view to be the landscape view
         self.view = loginVC_landscape.view;
     } completion:NULL];
 }
 else if (UIDeviceOrientationIsPortrait(deviceOrientation) && appDelegate().isShowingLandscapeView)
 {
     UIStoryboard *storyboard                = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:[NSBundle mainBundle]];
     MDBLogin *loginVC                       = [storyboard instantiateViewControllerWithIdentifier:@"MDBLogin"];
     appDelegate().isShowingLandscapeView    = NO;
     [UIView transitionWithView:loginVC.view duration:0 options:UIViewAnimationOptionTransitionCrossDissolve|UIViewAnimationCurveEaseIn animations:^{
         //>     Setup self.view to be now the previous portrait view
         self.view = loginVC.view;
     } completion:NULL];
 }}

Viel Glück für alle.

PS: Ich werde Ad Taylors Antwort akzeptieren, weil ich nach langem Warten und Suche nach einer Lösung etwas implementiert habe, das von seiner Antwort inspiriert ist. Danke Taylor.

War es hilfreich?

Lösung

Dies ist eine alte Frage, aber ich habe dies früher am Tag gelesen und musste dann viel Zeit verbringen, um eine bessere Lösung zu erarbeiten. Ich habe mir diese Lösung ausgedacht, indem ich das hackte Beispiel für alternative Ansicht Beispiel. Grundsätzlich serviert es eine modale Sicht auf die Landschaftsansicht.

#pragma mark Rotation view control

- (void)orientationChanged:(NSNotification *)notification
{
    // We must add a delay here, otherwise we'll swap in the new view
    // too quickly and we'll get an animation glitch
    [self performSelector:@selector(updateLandscapeView) withObject:nil afterDelay:0];
}

- (void)updateLandscapeView
{
    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
    if (UIDeviceOrientationIsLandscape(deviceOrientation) && !self.isShowingLandscapeView)
    {
        [self performSegueWithIdentifier: @"toLandscape" sender: self];
        self.isShowingLandscapeView = YES;
    }
    else if (deviceOrientation == UIDeviceOrientationPortrait && self.isShowingLandscapeView)
    {
        [self dismissModalViewControllerAnimated:YES];
        self.isShowingLandscapeView = NO;
    }    
}


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

Andere Tipps

Sie sollten im Allgemeinen nicht an getrennte Ansichten für unterschiedliche Orientierungen denken, es sei denn, sie sind sehr unterschiedlich (was sie wohl nicht sein sollten). Stattdessen sollten Sie sich darauf verlassen Masken autorisieren Um so viel von dem Inhalt Ihrer Ansicht auf basierend auf grundlegenden Einschränkungen zu vermitteln, wenn sich der Rahmen des Aufsehens ändert. Auf diese Weise können Unteransichten angemessen auf eine Änderung des Rahmens ihrer Übersicht reagieren, häufig aufgrund einer Änderung der Schnittstellenorientierung.

Um Ihre Frage direkter zu beantworten, nein, es gibt keine Möglichkeit für Xcode, annehmen oder zu sagen, welche Ansichten Sie für eine bestimmte Schnittstellenorientierung verwenden möchten, da dies niemals die Absicht von war UIKit'S View Architecture.

Hier finden Sie weitere Informationen zu Autorisierungsmasken: Das Handling -Layout -Änderungen ändert sich automatisch mithilfe von Autorisierungsregeln.

In Xcode v4.2.1 können Sie bei Verwendung von Storyboards nur die Ausrichtung des View -Controllers und nicht die Ansicht selbst ändern. Wenn Sie dort eine weitere Ansicht eingefügt haben, könnten Sie die Ausrichtung nicht ändern, selbst wenn Sie die sehen könnten Richtig anzeigen.

Die vorherige Art, zwei Ansichten zu haben, scheint also bei der Verwendung von Storyboards nicht zu funktionieren (bei Verwendung von NIBs, bei denen die Sichtausrichtung für separate Ansichten verändert werden kann).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top