【问题标题】:How would I go about getting the lowest and highest coordinate numbers from touchpoints?我将如何从接触点获取最低和最高坐标数?
【发布时间】:2021-04-26 20:36:38
【问题描述】:

无论绘制的形状是什么,我都想从 touchesmoved 事件中获取最低和最高的 x 和 y 坐标。基本上我想创建一个包含形状的 cgrect 。我不知道该怎么做。

【问题讨论】:

    标签: swift xcode uigesturerecognizer cgrect


    【解决方案1】:

    有多种方法可以做到这一点。

    UIBezierPath 有一个 bounds 方法,它会给你一个包含路径中所有点的边界矩形。如果您正在将您的形状构建为 UIBezierPath,那么您应该只需要。

    如果您需要自己跟踪边界,请设置一些变量并根据需要进行调整:

    var minY = CGFloat.greatestFiniteMagnitude
    var maxY = -CGFloat.greatestFiniteMagnitude
    
    var minX = CGFloat.greatestFiniteMagnitude
    var maxX = -CGFloat.greatestFiniteMagnitude
    

    当您从用户那里收集积分时,如果x 坐标是< minX,则更新minX。如果是> maxX,请更新maxX。对minYmaxY 执行相同操作。

    一旦有了xy 的最大值和最小值,就可以轻松地将这些值转换为边界矩形。一些示例代码:

    extension CGRect {
        init(minX: CGFloat,
             minY: CGFloat,
             maxX: CGFloat,
             maxY: CGFloat) {
            self.init()
           origin = CGPoint(x: minX, y: minY)
           size = CGSize(width: maxX - minX, height: maxY - minY)
       }
    }
    
    
    let aMinX: CGFloat = CGFloat(Int.random(in: 0...50))
    let aMinY: CGFloat = CGFloat(Int.random(in: 0...50))
    let aMaxX: CGFloat = CGFloat(Int.random(in: 60...200))
    let aMaxY: CGFloat = CGFloat(Int.random(in: 60...200))
    let aRect: CGRect = CGRect(minX: aMinX,
                               minY: aMinY,
                               maxX: aMaxX,
                               maxY: aMaxY)
    print(aRect)
    

    【讨论】:

    • 感谢您的回答,但有些地方不对劲。在 touchesmoved 事件中使用此代码,每次我跟踪相同的路径时都会得到很大的不同。我意识到使用鼠标我不会精确,但跟踪图像 5 次会得到明显不同的矩形大小。(15,43,56,76)(28,9,32,55)(41,42,125,134)(5 ,4,10,71)(38,48,128,73) 想法?
    • 我在大约 5 分钟内完成了该代码。它未经测试,仅用作您的方法的指南。 (而且我没有提供检测超过最大值/最小值的触摸的代码。)您需要对其进行测试和调试。我建议让您的测试版本在它提供的边界框周围画一个半透明的矩形,这样您就可以看到它在做什么。
    • 看起来我使用了错误的常量作为起始值。您应该改用greatestFiniteMagnitude-greatestFiniteMagnitude。我将编辑我的答案。
    • 好的,我找到了我需要的东西,感谢您的帮助。我最终只使用了 path.bounds.size(width and height)
    • 是的,使用路径的边界是我的第一个建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 2023-01-10
    相关资源
    最近更新 更多