2017-10-08 1 views
0

Hinweis: Die unspezifische Lösung, die hier gesucht wird, ist, wie vermieden werden kann, Code auszulösen, wenn sich die Bildschirmgröße nicht geändert hat, z. Spiegeln eines iPads auf seiner Y-Achse (von "landscapeLeft" zu "landscapeRight"), um eine Ansicht für jemanden zu zeigen, ohne dass die Größe geändert wird. Mit anderen Worten, die Ansicht wird gedreht, ohne die Größe zu ändern. Der Test bestätigt im Wesentlichen, dass keine intermediäre Rotation zu einer anderen Orientierung stattgefunden hat.Besserer Weg als die Verwendung einer Var außerhalb einer Funktion, um die Geräteausrichtung zu verfolgen?

Ich arbeite an einer Mapping-App und möchte die Zoomstufe konstant halten, wenn ich zwischen den Ausrichtungen wechsle. Es hat sich jedoch ein Fehler eingeschlichen, wenn das Upside-Up von Portraits nicht unterstützt wird, so wie ich es mit Telefonen machen möchte, aber nicht mit iPads (wo es überhaupt kein Problem gibt).

Wenn ich das Gerät zwischen Hochformat und Landschaft und zurück drehen, gibt es kein Problem. Wenn Sie jedoch von Querformat auf Hochformat drehen, wird viewWillTransition nicht ausgelöst. Wenn Sie von dort in den gegenüberliegenden Landschaftsmodus wechseln (z. B. landscapeLeft> portraitUpsideDown> landscapeRight), wird ein Aufruf von ViewWillTransition ausgelöst und die aktuelle Höhe der Karte wird erneut mit dem AspektRatio multipliziert, was zu einem Verkleinern führt.

Um dies zu stoppen, habe ich eine globale Variable außerhalb der Funktion erstellt und so eingestellt, dass die vorherige Ausrichtung beibehalten wird. Dieser Code funktioniert gut. Aber wenn es einen besseren Weg gibt, als eine globale Var zu verwenden, würde ich gerne lernen.

var previousOrientation = "" 

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { 

    var newOrientation = ""; 

    switch UIDevice.current.orientation{ 
    case .portrait: 
     newOrientation="Portrait" 

    case .landscapeLeft, .landscapeRight: 
     newOrientation="Landscape" 

    default: 
     newOrientation="Portrait" 
    } 

    if newOrientation == previousOrientation {return} 
    else{ previousOrientation = newOrientation} 

    let bounds = UIScreen.main.nativeBounds // alway related to portrait mode 
    let screenWidth = bounds.width 
    let screenHeight = bounds.height 

    let aspectRatio = Float(screenHeight/screenWidth) 

    if(UIDevice.current.orientation.isPortrait){ 

     mapViewC.height = mapViewC.height/aspectRatio 
    } 
    else{ 

     mapViewC.height = mapViewC.height * aspectRatio 
    } 
} 

Antwort

0

Nach umfangreichen Untersuchungen und Tests, fand ich, dass der zuverlässigste Weg, um diese (AFAIK) zu tun, war die globale var zu halten, aber die CGSize zu verwenden, die als Mittel zur Prüfung übergeben wird. Es ist sofort verfügbar, während die Ausrichtung möglicherweise noch nicht festgelegt ist. Schnelles Drehen oder Wenden des Geräts würde zu Fehlern führen. Ich konnte keinen Fehler auslösen, wenn die Größe wie hier gezeigt verwendet wird:

var previousSize = CGSize(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height) 

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { 

    if size == previousSize {return} 
    else{ previousSize = size} 

    let aspectRatio = Float(size.height/size.width) 

    mapViewC.height = mapViewC.height/aspectRatio 
} 
Verwandte Themen