比在func外部使用var跟踪设备方向更好的方法?

时间:2017-10-08 23:14:41

标签: ios swift global-variables orientation

注意:这里要寻找的非特定解决方案是如果屏幕尺寸没有改变,如何避免触发代码,例如:在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
    }
}

1 个答案:

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