如何在触摸位置获取层次结构中的所有视图 - Swift

Sar*_*ith 8 uikit ios swift

如何在我的触摸位置获得所有UIViews?

在下面的图像中,我需要用黄线接触所有UIViews.

UI层次结构中的代码段:

在此输入图像描述

我在寻找与SpriteKit类似的功能,我们用它来获取所有节点

self.nodes(at: touch.location(in: self))
Run Code Online (Sandbox Code Playgroud)

cle*_*ens 5

您必须遍历层次结构中的所有视图,例如:

extension UIView {
    func allViews(for touch: UITouch) -> [UIView] {
        return self.allViews(at: touch.location(in: self))
    }

    func allViews(at point: CGPoint) -> [UIView] {
        var stack = [UIView]()
        var result = [UIView]()

        stack.append(self)
        while let view = stack.popLast() {
            let localPoint = view.convert(point, from: self)

            if view.bounds.contains(localPoint) {
                result.append(view)
            }
            stack.append(contentsOf: view.subviews)
        }
        return result
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以从包含所有适当视图(例如视图控制器的视图)或窗口的任何超级视图开始。第二种方法的点必须相对于由 表示的视图的边界self

  • @clemens 然后强制解包 `stack.popLast()` 或使用 `while let view = stack.popLast()` 开始。 (2认同)

Ben*_*ato 0

在 UIKit 中,响应者链是这样工作的我认为没有办法获取所有列表,因为它会“消失”直到响应者捕获它而不是进一步。