【问题标题】:Merge overlapping CGRects合并重叠的 CGRect
【发布时间】:2021-07-29 20:26:54
【问题描述】:

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

【问题讨论】:

    标签: ios swift uikit cgrect


    【解决方案1】:

    Swift for 循环是静态的,这意味着在开始时确定的索引范围。虽然当您删除下一个项目时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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-18
      • 2022-01-20
      • 2015-06-13
      • 2016-10-17
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      • 2015-12-11
      相关资源
      最近更新 更多