【发布时间】:2021-01-13 13:55:28
【问题描述】:
对于我的应用,我试图确定圆形视图数组中的元素是否相互重叠。我有一个 for 循环,它遍历数组中的圆形元素,检查元素是否与前一个元素重叠,如果是的话;改变元素在视图中的位置:
func drawCircles(){
for c in circles {
c.center = getRandomPoint()
let prev = circles.before(c)
if let prevCircleCenter = prev?.center {
let dist = distance(prevCircleCenter, c.center)
//50 = width of each circle
if dist <= 50 {
var newCenter = c.center
var centersVector = CGVector(dx: newCenter.x - prevCircleCenter.x, dy: newCenter.y - prevCircleCenter.y)
centersVector.dx *= 51 / dist
centersVector.dy *= 51 / dist
newCenter.x = prevCircleCenter.x + centersVector.dx
newCenter.y = prevCircleCenter.y + centersVector.dy
c.center = newCenter
}
}
}
for c in circles {
self.view.addSubview(c)
}
}
这是我用来检查前一个元素的方法:
extension BidirectionalCollection where Element: Equatable {
func before(_ element: Element, loop: Bool = false) -> Element? {
if element == first && loop { return last }
guard let index = dropFirst().firstIndex(of: element) else {
return nil
}
return self[self.index(before: index)]
}
}
我曾尝试添加一个内部 for 循环来重新检查所有下一个和上一个元素是否重叠,但这似乎不起作用。
所以,我想我想弄清楚如何检查数组中的每个 CircleView 元素,以确保它们没有重叠的位置。
【问题讨论】: