为今后全面实施霍华德阳,这里的链接: https://github.com/oney/SingleDoubleTapGestureRecognizer
let tap = SingleDoubleTapGestureRecognizer(target: self, singleAction: Selector("singleTap"), doubleAction: Selector("doubleTap"))
tap.duration = 0.8
view.addGestureRecognizer(tap)
https://github.com/oney/SingleDoubleTapGestureRecognizer/blob/master/Pod/Classes/SingleDoubleTapGestureRecognizer.swift
//
// SingleDoubleTapGestureRecognizer.swift
// SingleDoubleTapGestureRecognizer
//
// Created by Howard Yang on 08/22/2015.
// Copyright (c) 2015 Howard Yang. All rights reserved.
//
import UIKit
public class SingleDoubleTapGestureRecognizer: UITapGestureRecognizer {
var targetDelegate: SingleDoubleTapGestureRecognizerDelegate
public var duration: CFTimeInterval = 0.3 {
didSet {
self.targetDelegate.duration = duration
}
}
public init(target: AnyObject, singleAction: Selector, doubleAction: Selector) {
targetDelegate = SingleDoubleTapGestureRecognizerDelegate(target: target, singleAction: singleAction, doubleAction: doubleAction)
super.init(target: targetDelegate, action: Selector("fakeAction:"))
numberOfTapsRequired = 1
}
}
class SingleDoubleTapGestureRecognizerDelegate: NSObject {
var target: AnyObject
var singleAction: Selector
var doubleAction: Selector
var duration: CFTimeInterval = 0.3
var tapCount = 0
init(target: AnyObject, singleAction: Selector, doubleAction: Selector) {
self.target = target
self.singleAction = singleAction
self.doubleAction = doubleAction
}
func fakeAction(g: UITapGestureRecognizer) {
tapCount = tapCount + 1
if tapCount == 1 {
delayHelper(duration, task: {
if self.tapCount == 1 {
NSThread.detachNewThreadSelector(self.singleAction, toTarget:self.target, withObject: g)
}
else if self.tapCount == 2 {
NSThread.detachNewThreadSelector(self.doubleAction, toTarget:self.target, withObject: g)
}
self.tapCount = 0
})
}
}
typealias DelayTask = (cancel : Bool) ->()
func delayHelper(time:NSTimeInterval, task:()->()) -> DelayTask? {
func dispatch_later(block:()->()) {
dispatch_after(
dispatch_time(
DISPATCH_TIME_NOW,
Int64(time * Double(NSEC_PER_SEC))),
dispatch_get_main_queue(),
block)
}
var closure: dispatch_block_t? = task
var result: DelayTask?
let delayedClosure: DelayTask = {
cancel in
if let internalClosure = closure {
if (cancel == false) {
dispatch_async(dispatch_get_main_queue(), internalClosure);
}
}
closure = nil
result = nil
}
result = delayedClosure
dispatch_later {
if let delayedClosure = result {
delayedClosure(cancel: false)
}
}
return result;
}
func cancel(task:DelayTask?) {
task?(cancel: true)
}
}
不,您需要直接处理水龙头以更改计时 – Wain 2015-04-04 21:21:56
我该怎么做?这是“最佳做法”吗? – Nico 2015-04-04 21:24:21
在单元格上并不重要,可能您会使用实现触摸事件方法的自定义子视图。或者,改变你的UI不要使用双击 – Wain 2015-04-04 21:26:14