Frage

Ich entwickle eine iPhone-Anwendung, die mehrere Federn hat, und nur Landschaft sein sollte.

Die Anwendung eingestellt ist im Querformat über seine Info.plist Datei starten.

Ich habe zwei View-Controller: FirstViewController und SecondViewController.

Für jede dieser habe ich eine Nib-Datei, wo der Blick in Landschaft. Beide View-Controller werden zu meiner MainView nib als Steckdosen, und ihre Ansichten sind träge initialisiert.

Wenn die Anwendung geladen wird, die erste Ansicht zeigt in der Landschaft, wie erwartet. Allerdings, wenn ich auf die zweite Ansicht wechseln, wird das Gerät (oder Simulator) bleibt in der Landschaft, aber die Ansicht gedreht wird, als ob sich das Gerät im Portrait-Modus waren, meine Schnittstelle bremsen.

In beiden UIViewController Klassen ich den folgenden Code haben:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return interfaceOrientation == UIInterfaceOrientationLandscapeRight;
}

und Ansichten zu wechseln, in meinem AppDelegate ich tue:

[viewController.view removeFromSuperview];
[window addSubview:secondViewController.view];

wobei viewController und secondViewController sind die beiden Auslässe in dem die Ansicht-Controller verbunden sind.

Dies ist, wie die zweite Ansicht in IB aussieht: alt text http://img27.imageshack.us/img27/4898/picture1ni.png

und das ist, wie es im Simulator aussieht: alt text http://img402.imageshack.us/img402/4866/picture2wt.png

Warum ist, dass die zweite Ansicht in Landschaft Anzeige aber mit der Schnittstelle gedreht?

Ich würde nicht Eigenschaften mit verwandeln beschäftigen möchten, denn das scheint übertrieben.

War es hilfreich?

Lösung

spielte ich diese Frage der Hoffnung, jemand würde Ihnen eine aufschlussreiche Antwort, und ich würde etwas lernen .. leider fürchte, ich bin, dass Sie dies vielleicht brauchen Transformationen benutzen Sie richtig zu arbeiten. Hier ist der Code, den ich habe in letzter Zeit mit dem Problem zu lösen:

- (void)forceLandscapeForView:(UIView *)theView {
  theView.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
  theView.bounds = CGRectMake(0, 0, 480, 320);
  theView.center = CGPointMake(160, 240);
  [theView setNeedsLayout];
  [theView setNeedsDisplay];
}

Dann, wenn Sie Ihre neue Ansicht hinzufügen, überprüfen Sie die aktuelle Ausrichtung und ggf. Kraft der Rotation:

if (!UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)) {
  [self forceLandscapeForView:_activeViewController.view];
}

Dann natürlich Sie wollen, angemessen reagieren in jedem Ihrer Ansicht Controller shouldAutorotateToInterfaceOrientation:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
  return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}

Ich würde gerne über alternative Lösungen zu hören, wenn diese nicht alle notwendig ist. Es gibt auch eine Einschränkung ich mit diesem Setup bemerkt habe: Wenn Sie einen Übergang zwischen den Ansichten haben, und Sie drehen Sie das Telefon während dieses Übergangs, ist es möglich, dass die Ansichten Orientierungen gekippt werden oder „stecken“ auf dem falschen Querformat, wie zur dass Sie benötigen das Telefon über (Landschaft rechts vs Landschaft links), wie Sie navigieren zwischen den Ansichten zu machen.

Andere Tipps

Es ist nur ein Vorschlag, aber man kann versuchen, für die zweite Ansicht NO im shouldAotorotate Methode zurückzukehren. Oder versuchen Sie es in der Portraitansicht in der IB zu machen. Es scheint, dass Ihre Ansicht korrekt (im Landscape-Modus) geladen, aber dann erhielt shouldAutorotate Nachricht und war um 90 Grad gedreht worden ist.

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