首页 > 解决方案 > 合并重叠的 CGRect

问题描述

如果我有一堂课Button

class Button: Hashable {
    private let id: String
    var name: String
    var rect: CGRect    
}

我还有一个Button:数组var buttons: [Button],如何合并buttons数组中的每个重叠按钮?CGRect具有intersects() -> Boolunion() -> CGRect功能。

我试过这个并且得到索引超出范围错误:

for i in 0..<buttons.count {
        for j in (i+1)..<buttons.count {
            if buttons[i].rect.intersects(buttons[j].rect) {
                let secondRect = buttons[j].rect
                let union = buttons[i].rect.union(secondRect)
                buttons[i].rect = union
                buttons.remove(at: j)
            }
        }
    }

标签: iosswiftuikitcgrect

解决方案


Swiftfor循环是静态的,这意味着在开始时确定索引的范围。虽然buttons.count当您删除下一个项目时会不断减少,但两者ij在计数直到开始buttons.count,这就是您崩溃的原因。

swift (c-like) 中没有动态for,这就是为什么你必须使用 while 来代替:

var i = 0
while i < buttons.count {
    var j = i + 1
    while j < buttons.count {
        if buttons[i].rect.intersects(buttons[j].rect) {
            let secondRect = buttons[j].rect
            let union = buttons[i].rect.union(secondRect)
            buttons[i].rect = union
            buttons.remove(at: j)
        } else {
            j += 1
        }
    }
    i += 1
}

推荐阅读