注意:这里要寻找的非特定解决方案是如果屏幕尺寸没有改变,如何避免触发代码,例如:在Y轴上翻转iPad(从landscapeLeft到landscapeRight),以便在没有调整大小的情况下向某人显示视图。换句话说,视图将旋转而不调整任何大小)。该测试基本上验证没有发生到不同方向的中间旋转。
我正在使用地图应用,并希望在切换方向之间保持缩放级别不变。然而,当没有支持肖像上下颠倒时,一种各种各样的错误悄悄进入,这是我想要使用手机的方式,而不是iPad(没有任何问题)。
当我在纵向和横向之间以及背面之间旋转设备时,没有问题。但是从横向模式旋转到纵向上下颠倒不会触发viewWillTransition。因此,从那里旋转到相反的横向模式(例如landscapeLeft> portraitUpsideDown> landscapeRight)会触发对viewWillTransition的调用,并再次将地图的当前高度乘以aspectRatio,从而导致缩小。
为了阻止这种情况,我在func之外创建了一个全局var,并将其设置为保留以前的方向。这段代码工作正常。但是,如果有比使用全球变量更好的方法,我想学习。
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
}
}
答案 0 :(得分:0)
经过大量的研究和测试,我发现最可靠的方法(AFAIK)是保持全局var,但是使用作为测试手段传递的CGSize。它可以立即使用,而方向可能尚未设置。快速旋转或翻转设备会导致后者出错。使用大小时,我无法触发错误,如下所示:
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
}