将手指拖离它时取消选择 UIView“按钮”

Posted

技术标签:

【中文标题】将手指拖离它时取消选择 UIView“按钮”【英文标题】:Deselect UIView "button" when dragging finger off of it 【发布时间】:2018-07-25 04:22:28 【问题描述】:

我有一个UIView,我添加了一个UILongPressGestureRecognizer,这样我就可以处理点击并让UIView 像一个按钮一样工作。

let longPressGtr = UILongPressGestureRecognizer(target: self, action:#selector(longPressSelector))
longPressGtr.minimumPressDuration = 0.1
myView.isUserInteractionEnabled = true
myView.addGestureRecognizer(longPressGtr)


@objc func longPressSelector(_ gestureRecognizer: UILongPressGestureRecognizer) 
    if gestureRecognizer.state == .began 
        myView.backgroundColor = UIColor.gray
     else if gestureRecognizer.state == .ended 
        myView.backgroundColor = UIColor.blue // my button is blue
        doSomething()
    


func doSomething() 
    print("view was pressed")

这行得通,但是当我按住 UIView 但将手指拖离视图时,“按钮”不会取消选择。它仍然会触发doSomething()。一个普通的UIButton 将取消选择该按钮并且不会触发它的 onClick 如果您按住它并拖动手指离开视图。

如何在我的UIView 中实现此功能?

或者有没有更好的方法让UIView 像一个按钮一样?

【问题讨论】:

你的意思是什么它仍然像点击一样触发功能。是否意味着doSomething 仍然被解雇?但是按钮颜色没有变成蓝色? @RatulSharker 是的。这意味着 doSomething 被解雇了 但是你的按钮没有变成蓝色,对吧?是问题吗? @RatulSharker 按钮变为蓝色并触发 doSomething 【参考方案1】:

您需要检查手势是否在视图内。

@objc func longPresserDidFire(_ presser: UILongPressGestureRecognizer) 
    let gestureIsInside = myView.point(inside: presser.location(in: myView), with: nil)
    switch presser.state 
    case .began, .changed:
        if gestureIsInside 
            myView.backgroundColor = .blue
         else 
            myView.backgroundColor = .gray
        
    case .cancelled:
        myView.backgroundColor = .gray
    case .ended:
        myView.backgroundColor = .gray
        if gestureIsInside 
            doSomething()
        
    default: break
    

【讨论】:

这很棒。这可以是扩展吗?【参考方案2】:

您没有添加gestureRecognizer状态更改的条件,这就是它接受结束状态的原因。

@objc func longPressSelector(_ gestureRecognizer: UILongPressGestureRecognizer) 
    if gestureRecognizer.state == .began 

     else if gestureRecognizer.state == .changed 

    else if gestureRecognizer.state == .ended 

    

再添加一个条件并检查它是否有效。

【讨论】:

【参考方案3】:

当您将手指拖出视图时,gestureRecognizer 可能会转换为failedcancelled 状态,因此您需要添加对这种情况的处理gestureRecognizer.state == .failedgestureRecognizer.state == .cancelled

【讨论】:

【参考方案4】:
@objc func longPressSelector(_ gestureRecognizer: UILongPressGestureRecognizer) 


放置 UILongPressGestureRecognizer 而不是 UITapGestureRecognizer 并检查它

【讨论】:

没关系。 这很重要,但不能解决问题。很好的尼拉夫。

以上是关于将手指拖离它时取消选择 UIView“按钮”的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UIView 上移动手指时添加图像?

如何防止在拖动 UIPickerView 时触发按钮?

单选按钮在动态创建的 RadioGroup 中没有正确选择/取消选择

iOS 接触开始

通过在多个按钮上滑动手指来选择多个按钮

如何创建将多个按钮组合在一起并启用滑动以选择所有按钮的 iOS UiView