问题描述
无论绘制的形状是什么,我都想从 touchesmoved 事件中获得最低和最高的 x 和 y 坐标。基本上我想创建一个包含形状的 cgrect 。我不知道该怎么做。
解决方法
有多种方法可以做到这一点。
UIBezierPath
有一个 bounds 方法,它会给你一个包含路径中所有点的边界矩形。如果您正在将您的形状构建成一个 UIBezierPath
,这应该是您所需要的。
如果您需要自己跟踪边界,请设置一些变量并根据需要进行调整:
var minY = CGFloat.greatestFiniteMagnitude
var maxY = -CGFloat.greatestFiniteMagnitude
var minX = CGFloat.greatestFiniteMagnitude
var maxX = -CGFloat.greatestFiniteMagnitude
当您从用户那里收集点数时,如果 x
坐标为 < minX
,请更新 minX
。如果是 > maxX
,则更新 maxX
。对 minY
和 maxY
执行相同操作。
一旦您拥有 x
和 y
的最大值和最小值,将这些值转换为边界矩形就很简单了。一些示例代码:
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)