关于UIButton 添加 UILongPressGestureRecognizer

658 阅读1分钟

最近在做项目的时候,有Button需要响应长按手势,当时以为很简单,添加就完事了吗,结果后面发现各种不符合预期效果。

我们的button有三种状态,分别是 normal highlight 以及 disable, 当button添加了长按手势,触发长按,UIButton的高亮状态会消失,这是因为识别为长按后会将UIButton的touch cancel掉,UIButton不会给长安设置highlighted状态。

当时找到cancelsTouchesInView 设置为false,虽然长按时能正常显示长按了,但是会同时响应button自己的点击事件,以及在长按的过程中,设置isEnabled不会使按钮置灰,手抬起的时候才会置灰,不符合。

后面找到一篇文章是在长按手势的时候,begin状态以及end状态设置isSelected并且换图,原文链接

看了这个方案后,将Button的selected状态的图片设置为highlighted一样的,然后在手势识别的时候设置button的isSelected,即可完美解决

伪代码

@objc func longPressGesture(_ gesture: UILongPressGestureRecognizer) {
        guard let btn = gesture.view as? UIButton else { return }
        
        if gesture.state == .began {
            btn.isSelected = true
        } else if gesture.state == .changed {

        } else {
            btn.isSelected = false
        }
    }