将手指拖离它时取消选择 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
可能会转换为failed
或cancelled
状态,因此您需要添加对这种情况的处理gestureRecognizer.state == .failed
和gestureRecognizer.state == .cancelled
。
【讨论】:
【参考方案4】:@objc func longPressSelector(_ gestureRecognizer: UILongPressGestureRecognizer)
放置 UILongPressGestureRecognizer 而不是 UITapGestureRecognizer 并检查它
【讨论】:
没关系。 这很重要,但不能解决问题。很好的尼拉夫。以上是关于将手指拖离它时取消选择 UIView“按钮”的主要内容,如果未能解决你的问题,请参考以下文章