IOS 长按手势UILongPressGestureRecognizer 开始/结束(按下/抬起)

Blog UV: AmazingCounters.com



一般我们使用长按手势的目的都是为了触发某种响应,通过控制属性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))
                    }
                })
            }
        }
    }



转载请注明出处:http://zyden.vicp.cc/uilongpressgesturerecognizer/
谢谢

comments powered by Disqus