我知道使用Apple API过滤oneTap/doubleTap.代码如下.
UITapGestureRecognizer *doubleTapGestureRecognizer = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(handleDoubleTap:)];
doubleTapGestureRecognizer.numberOfTapsRequired = 2;
[self addGestureRecognizer:doubleTapGestureRecognizer];
UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
singleTapGestureRecognizer.numberOfTapsRequired = 1;
**[singleTapGestureRecognizer requireGestureRecognizerToFail: doubleTapGestureRecognizer];**
[self addGestureRecognizer:singleTapGestureRecognizer];
Run Code Online (Sandbox Code Playgroud)
但oneTap/doubleTap checkDelayTime感觉如此之长(约0.5秒?).一般来说App的用户反应非常快.虽然0.5秒通常是短时间.但在移动设备环境中是长期的,因为用户的反应非常重要.
说到这一点,YouTubeApp
有一个非常完美的算法,关于oneTap/doubleTap时刻的过滤.oneTap-doubleTap checkDelay是VeryVeryShort完美优化.
oneTap(show/hidden controlBar)
doubleTap(完整/默认videoScreenSize)
如何实现像YoutubeApp?关于oneTap-doubleTap过滤不使用requireGestureRecognizerToFail选择器.关于非常短的延迟oneTap-doubleTap区分.
我认为YoutubeApp不使用requireGestureRecognizer选择器.
我想在Swift中定义自定义UIGestureRecognizer,但是我无法导入UIGestureRecognizerSubclass并且无法覆盖"touchesBegan","touchesMoved"等方法.
"UIGestureRecognizerSubclass.h"位于UIKit模块中,但只能在Swift中导入模块,并且无法导入头文件.
如何导入UIGestureRecognizerSubclass并定义自定义UIGestureRecognizer?
编辑:
我在Bridging-Header.h中添加了以下代码,并成功编译了我的自定义手势识别器.
#import <UIKit/UIGestureRecognizerSubclass.h>
Run Code Online (Sandbox Code Playgroud)
但是这段代码可能会为我项目中的每个swift文件导入"UIGestureRecognizerSubclass.h",所以我认为这不是最好的方法.
这是对的吗?还有其他合适的解决方案吗
我试图覆盖UITapGestureRecognizer的自定义子类中的touchesBegan。代码如下。我是从这里得到的:如何加快对双击的识别?。这是公认的答案,但我遇到一个错误:方法未从其超类覆盖任何方法。我已经检查过了,这似乎确实是touchesBegan的签名。救命?
import UIKit
class UIShortTapGestureRecognizer: UITapGestureRecognizer {
let tapMaxDelay: Double = 0.3
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
super.touchesBegan(touches, withEvent: event)
delay(tapMaxDelay) {
// Enough time has passed and the gesture was not recognized -> It has failed.
if self.state != UIGestureRecognizerState.Ended {
self.state = UIGestureRecognizerState.Failed
}
}
}
}
Run Code Online (Sandbox Code Playgroud)