-
Notifications
You must be signed in to change notification settings - Fork 7
长按手势UILongPressGestureRecognizer 开始 结束(按下 抬起)
liuzhiyi1992 edited this page Jan 24, 2016
·
1 revision
>个人博客原文:http://zyden.vicp.cc/uilongpressgesturerecognizer/ 转载请注明出处,谢谢
一般我们使用长按手势的目的都是为了触发某种响应,通过控制属性minimumPressDuration来控制最小触发时间(默认为0.5秒),而如果有一种非常见但是又很合理的需求:触发长按后开启某个子线程循环执行某种操作,而且在用户不需要时停止。例如一个类似计算器的一个面板:
这里需要长按删除键实现快速删除,当然抬起后就会停止,我用了不同状态控制着快速删除线程的工作与否,前提是能获取到长按手势的开始和结束状态,这个长按手势封装得比较隐蔽。跟NSNotificationCenter一样,UILongPressGestureRecognizer的target的action方法其实是可以接受参数的:
let longPressGesture = UILongPressGestureRecognizer(target: self, action: "longPressCancalButton:")
当action方法被调用时,系统会连带UILongPressGestureRecognizer对象自己作为参数一同传递
func longPressCancalButton(action: UILongPressGestureRecognizer) {
}
在这里打一个breakPoint可以发现UILongPressGestureRecognizer对象里有个枚举类型的state属性,存放着长按手势的各种状态信息
在里面我们找到了最直观的Began和Ended。长按手势的触发和结束控制就迎刃而解了。当然在UILongPressGestureRecognizer的delegate方法里做还是一样的,这里就不列出来
####顺便把代码贴出来,可以忽略:
func longPressCancalButton(action: UILongPressGestureRecognizer) {//长按快速删除
if action.state == UIGestureRecognizerState.Ended {
self.doingFastCancal = false
} else if action.state == UIGestureRecognizerState.Began {
self.doingFastCancal = true
}
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { () -> Void in
while self.doingFastCancal {
NSThread.sleepForTimeInterval(0.1)
dispatch_async(dispatch_get_main_queue(), { () -> Void in
if self.displayLabel.text?.lenth > 0 && self.doingFastCancal {
self.displayLabel.text = self.displayLabel.text?.substringToIndex(self.displayLabel.text!.endIndex.advancedBy(-1))
}
})
}
}
}