2016-10-12 8 views
1

In einer App entwickeln wir uns der Benutzer wählen zu lassen, bevorzugte Orientierung (dh eine Option, wenn sie wählen wird im Hochformat und das gleiche gilt für Landscape und wenn Both wird entschieden Portrait die App die gesperrt werden App wird auf alle Orientierung arbeiten) Ich teile den Code für das, was ich versucht habe, und ich bin mir nicht sicher, ob diese Funktionalität überhaupt möglich ist.Programmatically Schloss iDevice Orientierung

Wenn ich jedoch im Hochformat "Querformat" wähle, wird automatisch in Querformat umgeschaltet. Aber wenn ich das Gerät wieder ins Hochformat rotiere, funktioniert es auch (was nicht nach der Anforderung funktionieren sollte). Die Anforderung ist vergleichbar mit der Einstellung, wenn das Projekt nur im Hochformat eingerichtet wird und wie es sich verhält, wenn das Gerät in den Querformatmodus gedreht wird.

+0

ich glaube, das Konzept hier falsch ist, müssen Sie immer die Orientierung Unterstützung in den einzelnen View-Controller verwalten, und der Moderator oder Controller, die den Navigationsstapel verwaltet, muss die Ausrichtung Unterstützung der meisten Top-erben sichtbarer sichtbarer Controller jedes Mal. – holex

Antwort

2

Ich habe gerade ein Beispielprojekt geschrieben, um zu testen, ob das möglich ist. Nun, ich denke es ist! Leider

UIViewController.attemptRotationToDeviceOrientation()

den Job nicht magisch macht, wie ich hoffe - es ist ein wenig komplexer als das ist. Bitte nehmen Sie eine Beute unter dem folgenden Code. All die Magie, die Sie brauchen, passiert in der Aktion forceChangeOrientations.

class ViewController: UIViewController { 

    enum Orientation { 
     case Landscape 
     case Portrait 

     mutating func changeOrientation() { 
      if self == .Portrait { 
       self = .Landscape 
      } 
      else { 
       self = .Portrait 
      } 
     } 

     func supportedInterfaceOrientations() -> UIInterfaceOrientationMask { 
      switch self { 
      case .Landscape: 
       return .Landscape 
      case .Portrait: 
       return .Portrait 
      } 
     } 

     func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation { 
      switch self { 
      case .Landscape: 
       return UIInterfaceOrientation.LandscapeLeft 
      case .Portrait: 
       return .Portrait 
      } 
     } 
    } 

    var currentOrientation: Orientation = .Portrait 

    // Returns a Boolean value indicating whether the view controller's contents should auto rotate. 
    override func shouldAutorotate() -> Bool { 
     return true 
    } 

// Returns all of the interface orientations that the view controller supports. 
    override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask { 
     return currentOrientation.supportedInterfaceOrientations() //UIInterfaceOrientationMask.All 
    } 

// Returns the interface orientation to use when presenting the view controller. 
    override func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation { 
     return UIInterfaceOrientation.Portrait 
    } 

    @IBAction func forceChangeOrientations(sender: AnyObject) { 
     self.currentOrientation.changeOrientation() 

     let value = self.currentOrientation.preferredInterfaceOrientationForPresentation().rawValue 
     UIDevice.currentDevice().setValue(value, forKey: "orientation") 
     UIViewController.attemptRotationToDeviceOrientation() 
    } 

} 
+0

Danke für die Antwort. Ich habe deine Antwort in einem separaten Projekt versucht und es funktioniert wie erwartet :) Nur eine Frage, wenn ich 'currentOrientation' als globale Variable setze, wird es bei allen Klassen funktionieren? damit alle Seiten in der ausgewählten Ausrichtung bleiben. – Nina

+0

Ja können Sie. :) Bitte beachten Sie, dass wenn Sie (und wahrscheinlich auch) die navigationControllers in Ihrer Anwendung verwenden, sollten Sie die navigationController ableiten und diese Methode hinzufügen, so dass Sie dieses Verhalten für alle Controller in seinem navigationStack haben. Wenn Sie weitere Hilfe benötigen, könnte ich irgendwo ein Testprojekt hochladen, so dass Sie sich die komplexere Situation von navigationController ansehen können. –

+0

Können Sie bitte ein Beispielprojekt für den Navigationscontroller hochladen? Es wird sehr hilfreich sein :) – Nina