为什么我不能与子视图交互?

问题描述 投票:0回答:1

我有一个视图控制器,在那里我可以用一个 LongPressGesture. 对于每个 subview 我提供 TapGesture 该开 popover 的视图(见下图)。

我的问题是,我只能打开我添加的最后一个子视图的弹出窗口,那么为什么我不能与其他子视图交互了呢?那么为什么我不能与其他子视图交互了呢?这是我在Swift中的第一个App,所以如果有人能帮助我,那就太好了。

给你一些代码。这是根视图控制器上的LongPressGesture,用来创建一个新的子视图。

@IBAction func onLongPress(_ gesture : UILongPressGestureRecognizer) {

    let position: CGPoint = gesture.location(in: view)

    if(gesture.state == .began) {
        let subview = MySubview(position: position)
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
        subview.addGestureRecognizer(tapGesture)

        view.addSubview(subview)
    }
    else if (gesture.state == .ended) {
        let subview = self.view.subviews.last
        self.openContextMenu(for: subview)
    }
}

带有子视图的ViewController:-。

ios swift xcode ipad
1个回答
0
投票

当对一个事件(在你的例子中是长按)做出反应时,只有第一个响应者会处理该事件。当向一个视图添加子视图时,所有的子视图都是一个接一个地添加的。所以最后一个添加的子视图将处理该事件--如果它正在监听该事件的话。如果你需要一个特定的子视图来处理事件,你可以把它作为

parentView.bringSubviewToFront(view: subView)

另外,你也可以禁用其他子视图,如

subView.isUserInteractionEnabled = false

0
投票

好吧,我找到了一个解决我问题的方法。好处是,它只检测子视图框架中的触摸。

在我的根视图控制器中,我添加了

    var isPanGesture = false

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        isPanGesture = true

        if let subview = touches.first!.view as? MySubview {
            let position = touches.first!.location(in: self.view)
            link.center = position
        }
    }
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let subview = touches.first!.view as? MySubview {
            if(!isPanGesture) {
                self.openContextMenu(for: subview)
            }
            isPanGesture = false
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.