代码之家  ›  专栏  ›  技术社区  ›  Micro

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

  •  0
  • Micro  · 技术社区  · 7 年前

    我有一个 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 将取消选择按钮而不启动它。如果您按住按钮,请将手指从视图上拖下。

    如何将此功能实现到 UIView公司 ?

    或者有更好的方法 UIView公司 像个按钮?

    4 回复  |  直到 7 年前
        1
  •  1
  •   rob mayoff    7 年前

    你需要检查手势是否在视图中。

    @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
  •  0
  •   Amit    7 年前

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

    @objc func longPressSelector(_ gestureRecognizer: UILongPressGestureRecognizer) {
        if gestureRecognizer.state == .began {
    
        } else if gestureRecognizer.state == .changed {
    
        }else if gestureRecognizer.state == .ended {
    
        }
    }
    

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

        3
  •  0
  •   cocavo    7 年前

    当你把手指拖到外面的时候, gestureRecognizer 可能被翻译成 failed cancelled 州政府,所以你需要增加对这些案件的处理 gestureRecognizer.state == .failed gestureRecognizer.state == .cancelled .

        4
  •  -1
  •   Liftoff    7 年前
    @objc func longPressSelector(_ gestureRecognizer: UILongPressGestureRecognizer) {
    
    }
    

    地点 UILongPressGestureRecognizer识别器 而不是 UITapGestureRecognizer接口 检查一下