微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

合并重叠的 CGRects

如何解决合并重叠的 CGRects

如果我有一个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)
            }
        }
    }

解决方法

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

swift 中没有动态 for(类似 c),这就是为什么你必须使用 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
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。