代码之家  ›  专栏  ›  技术社区  ›  Heuristic

Swift:从视图层次创建平面视图阵列

  •  0
  • Heuristic  · 技术社区  · 6 年前

    我有一个视图层次结构,我需要将其展平为一个线性阵列,例如:

    + rootView 0 - subView 1 - subview 2 + subview 3 - subview 3.1 - subview 3.2 - subview 4

    我需要一组:

    [0, 1, 2, 3, 3.1, 3.2, 4]

    我想知道 map flatMap 可以使用,或者如果我必须使用传统的方式,如宽度优先遍历?

    谢谢

    1 回复  |  直到 6 年前
        1
  •  2
  •   silly_cone Tysac    3 年前

    我将使用递归函数,您可以在 rootView

    func flattenSubviews(view: UIView) -> [UIView] {
        
        var flatArray: [UIView] = []
        flatArray.append(view)
        
        for subview in view.subviews {
            flatArray += flattenSubviews(view: subview)
        }
        return flatArray
    }
    

    let flattenedViews = flattenSubviews(view: rootView)
    

    通过将其放在扩展中来编写上述内容的一种略为抽象的方式:

    extension UIView {
    
        func subviewsFlattened() -> [UIView] {
        
            var output: [UIView] = []
            output.append(self)
        
            for subview in self.subviews {
                output += subview.subviewsFlattened()
            }
        
            return output
        }
    
    }
    

    然后您可以在任何视图上调用它:

    let allViews = someView.subviewsFlattened()