临时禁用手势识别器的滑动功能。

5

我有一个带有多个按钮和图像的uiview。我像tinder一样拖动那张卡片。

我想在某些点停止用户拖动卡片,而在其他点允许他们拖动。

我尝试禁用它,但是我所做的方式禁用了整个视图的所有用户交互,停止了滑动,但也停止了用户点击按钮的功能(我不想这样做,我只想阻止他们滑动)。

这是我启动滑动的方式:

let gestureBack = UIPanGestureRecognizer(target: self, action: Selector("wasDraggedBack:"))
backview.addGestureRecognizer(gestureBack)

这是我错误地尝试停止滑动的方法:

  self.backview.userInteractionEnabled = true

我该如何停止视图滑动,而不影响视图内的所有其他按钮等。

谢谢


首先尝试将gestureBack.enabled设置为NO,如果没有效果,则需要在wasDraggedBAck方法中设置一个标志,仅在该标志设置为YES时继续。 - Teja Nandamuri
请参考以下链接:https://dev59.com/nG025IYBdhLWcg3wc1xM - Teja Nandamuri
4个回答

6

是的,对于这个问题,UIGestureRecognizer有一个委托方法,您可以像下面这样设置委托方法

let gestureBack = UIPanGestureRecognizer(target: self, action: Selector("wasDraggedBack:"))
backview.addGestureRecognizer(gestureBack)
//set the delegate
 gestureBack.delegate? = self

同时也要确认委托类似于以下内容:

class ViewController: UIViewController,UIGestureRecognizerDelegate {

}

最后,使用此代理方法触发动作。
func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool {
    //condition to recognise the gesture 
    return true; //or false
}

4
根据文档,所有 UIGestureRecognizer 类对象都有一个 enabled 属性。
它的作用是:
禁用手势识别器以使其无法接收触摸。默认值为 true。如果您在手势识别器当前正在识别手势时将此属性更改为 false,则手势识别器将转换为已取消状态。

3
你可以做如下操作:

你可以这样做:

 gestureBack.enabled = false

0

简而言之:您需要禁用手势。

gesture.isEnabled = enabled

我有几个已注册手势的视图对象。我实现的解决方案如下:

  1. 创建一个函数,可以在控制器中启用/禁用除所选视图之外的所有视图上的手势。
/// Set other views interaction off except the selected view
/// Prevent the image accidentally taking over
private func setViewGestures(enabled: Bool, excludedView: UIView) {
    for subview in view.subviews {
        if subview == excludedView {
            continue
        }
        // Disable gestures
        if let gestures = subview.gestureRecognizers {
            for gesture in gestures {
                gesture.isEnabled = enabled
            }
        }
    }
}

其次,在 UIGestureRecognizerDelegate 函数中:
func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
    guard let gestureView = gestureRecognizer.view else {
        return false
    }
    setViewGestures(enabled: false, excludedView: gestureView)
}

最后,在手势识别器函数中,当手势结束时,重新启用手势。
@objc func handlePan(_ gesture: UIPanGestureRecognizer) {
    guard let gestureView = gesture.view else {
        return
    }
    if gesture.state == .ended {
        setViewGestures(enabled: true, excludedView: gestureView)
    }
    // Do gesture stuff
}

就是这样!当一个手势处于活动状态时,其他手势将被禁用,并在手势结束后重新启用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接