当前位置: 首页 > 知识库问答 >
问题:

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

谷德本
2023-03-14

注意:这里寻求的非特定解决方案是,如果屏幕大小没有改变,如何避免触发代码,例如,在Y轴上翻转iPad(从landscapeLeft到landscapeRight),向某人显示视图而不调整其大小。换句话说,视图将旋转而不调整大小)。该测试基本上验证了没有发生向不同方向的中间旋转。

我正在开发一个地图应用程序,希望在方向之间切换时保持缩放级别不变。然而,当纵向上下不受支持时,就会出现某种错误,这是我想用手机的方式,而不是用iPad(在iPad上没有任何问题)。

当我在纵向和横向之间旋转设备并返回时,没有问题。但是从任一横向模式旋转到纵向颠倒不会触发viewWillTranection。因此,从那里旋转到相反的横向模式(例如,横向向左

为了阻止这种情况,我在func之外创建了一个全局var并将其设置为保留以前的方向。这段代码运行良好。但是如果有比使用全局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个答案

柯正谊
2023-03-14

经过大量的研究和测试,我发现最可靠的方法(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
}
 类似资料:
  • Edit:是我现在正在做的事情,但是由于只是返回,所以这似乎是对Map的误用。另外,它读起来并不像是商业逻辑。 最后编辑:我接受了@Holger的回答。不能期望处理流上的所有元素,因为它不是终端操作。也是如此。即使您可能已经终止了您的流,以保证它将处理所有操作,您也不应该编写期望每个用户都这样做的代码。因此,要进行处理,您应该在上使用,然后根据需要再次开始对进行流式处理。

  • jd.startDeviceMotionListening(Object object) 开始监听设备方向的变化。 参数 Object object 属性 类型 默认值 必填 说明 interval string normal 否 监听设备方向的变化回调函数的执行频率 success function 否 接口调用成功的回调函数 fail function 否 接口调用失败的回调函数 comple

  • 问题内容: 这行不通 警告:mysqli_stmt :: bind_param():第1行上/home/rgero/public_html/php/searchadmins.php中已准备好的语句中的变量数量与参数数量不匹配 这个也不行 致命错误:错误的SQL:SELECT * FROM WHERE用户名类似%{?}%错误:第1行的/home/rgero/public_html/php/searc

  • 我有一个要求,取决于地图的特定键值,我需要格式化输出。 例如,如果它的值大于1,那么只需要在值(12.23)后面显示2个小数点,或者如果它的值小于1,我需要在它后面显示4个小数点。 我已经编写了代码,它工作正常,但我正在寻找一种更好的方法来做到这一点(基本上我不喜欢我的代码中的其他条件) 这是我的程序,根据最后一个属性键值,我正在格式化输出

  • 问题内容: 最近,我发现一篇不错的博客文章,介绍了在Redis的帮助下跟踪网站在线用户的2种方法。 1)智能键并设置其过期时间 http://techno-weenie.net/2010/2/3/where-s-waldo-track-user- locations-with-node-js-and-redis 2)设置和相交 http://www.lukemelia.com/blog/archi

  • 使用指南 - 统计设置 - 第三方推广管理 - 指定广告跟踪的用途与设置方法 指定广告追踪用途: 指定广告跟踪将提供您各种其它媒介推广为您网站带来的流量情况。通过对各种媒介推广给您网站带来的流量对比,您可以了解哪种媒介推广能够给您网站带来较多的流量,哪种媒介推广给您网站带来的流量质量较高。基于各种媒介推广带来的不同流量及流量质量,您可以进一步比较分析在各种媒介上的关键词和创意,了解哪些关键词和创意