最近在做项目的时候,有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
}
}