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
}
}