Skip to content

长按手势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))
                    }
                })
            }
        }
    }