我有一个视图控制器,在那里我可以用一个 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:-。
当对一个事件(在你的例子中是长按)做出反应时,只有第一个响应者会处理该事件。当向一个视图添加子视图时,所有的子视图都是一个接一个地添加的。所以最后一个添加的子视图将处理该事件--如果它正在监听该事件的话。如果你需要一个特定的子视图来处理事件,你可以把它作为
parentView.bringSubviewToFront(view: subView)
另外,你也可以禁用其他子视图,如
subView.isUserInteractionEnabled = false
好吧,我找到了一个解决我问题的方法。好处是,它只检测子视图框架中的触摸。
在我的根视图控制器中,我添加了
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
}
}