iOS 第一次打开时区分单击和双击
iOS distinguish single tap and double tap at first opening
我知道我可以使用 requireGestureRecognizerToFail
函数来区分单击和双击,但是我遇到了一个小问题,我想修复它。我的代码如下:
- (IBAction)singleTap:(UITapGestureRecognizer *)sender {
NSLOGD_METADATAONLY();
hideNavigationBar();
hideStatusBar();
[sender requireGestureRecognizerToFail:self.doubleTapRecognizer];
}
- (IBAction)doubleTap:(UITapGestureRecognizer *)sender {
NSLOGD_METADATAONLY();
//TODO
}
当我打开文件并双击(action1) 时,会先调用单击(result1),然后调用双击(result2)。
但是如果我打开一个文件并单击(action3),然后双击(action4),action4 的结果运行良好,将不会调用单击,只会调用双击。我想这是因为在 action3 中调用了函数 requireGestureRecognizerToFail
。
我的问题是如何让 action1 只调用 result2 而不是调用 result1?
在 ViewDidLoad 中写入以下行
[单击 requireGestureRecognizerToFail:doubleTap];
在创建 UITapGestureRecognizer
时使用 [singleTapRecognizer requireGestureRecognizerToFail: doubleTapRecognizer]
更新您的代码
示例:
// single tap
UITapGestureRecognizer *singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget: tableViewController action: @selector(handleSingleTapOnView:)];
[singleTapRecognizer setNumberOfTouchesRequired:1];
[singleTapRecognizer requireGestureRecognizerToFail:doubleTapRecognizer];
[view addGestureRecognizer: singleTapRecognizer];
// double tap
UITapGestureRecognizer *doubleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget: tableViewController action: @selector (handleDoubleTapOnView:)];
[doubleTapRecognizer setNumberOfTouchesRequired:2];
[view addGestureRecognizer: doubleTapRecognizer];
当您为手势识别器设置 requireGestureRecognizerToFail:
时,您是说它应该只识别其他手势识别器不识别的手势。
将您的 class 扩展为 UIGestureRecognizerDelegate
。
class ViewController: UIViewController, UIGestureRecognizerDelegate {
然后将您的视图控制器指定为手势识别器的委托。
tapGesture .delegate = self;
doubleTapGesture .delegate = self;
实施 shouldRequireFailureOf
可防止在另一个手势识别器明确达到失败状态之前识别一个手势。
您只需要在双击失败后识别单击,这种情况发生在触摸序列仅包含一次点击时。
这可以通过以下实现来实现。
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
// Don't recognize a single tap until a double-tap fails.
if gestureRecognizer == self.tapGesture &&
otherGestureRecognizer == self.doubleTapGesture {
return true
}
return false
}
希望如此helps.Happy编码!!
我知道我可以使用 requireGestureRecognizerToFail
函数来区分单击和双击,但是我遇到了一个小问题,我想修复它。我的代码如下:
- (IBAction)singleTap:(UITapGestureRecognizer *)sender {
NSLOGD_METADATAONLY();
hideNavigationBar();
hideStatusBar();
[sender requireGestureRecognizerToFail:self.doubleTapRecognizer];
}
- (IBAction)doubleTap:(UITapGestureRecognizer *)sender {
NSLOGD_METADATAONLY();
//TODO
}
当我打开文件并双击(action1) 时,会先调用单击(result1),然后调用双击(result2)。
但是如果我打开一个文件并单击(action3),然后双击(action4),action4 的结果运行良好,将不会调用单击,只会调用双击。我想这是因为在 action3 中调用了函数 requireGestureRecognizerToFail
。
我的问题是如何让 action1 只调用 result2 而不是调用 result1?
在 ViewDidLoad 中写入以下行
[单击 requireGestureRecognizerToFail:doubleTap];
在创建 UITapGestureRecognizer
[singleTapRecognizer requireGestureRecognizerToFail: doubleTapRecognizer]
更新您的代码
示例:
// single tap
UITapGestureRecognizer *singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget: tableViewController action: @selector(handleSingleTapOnView:)];
[singleTapRecognizer setNumberOfTouchesRequired:1];
[singleTapRecognizer requireGestureRecognizerToFail:doubleTapRecognizer];
[view addGestureRecognizer: singleTapRecognizer];
// double tap
UITapGestureRecognizer *doubleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget: tableViewController action: @selector (handleDoubleTapOnView:)];
[doubleTapRecognizer setNumberOfTouchesRequired:2];
[view addGestureRecognizer: doubleTapRecognizer];
当您为手势识别器设置 requireGestureRecognizerToFail:
时,您是说它应该只识别其他手势识别器不识别的手势。
将您的 class 扩展为 UIGestureRecognizerDelegate
。
class ViewController: UIViewController, UIGestureRecognizerDelegate {
然后将您的视图控制器指定为手势识别器的委托。
tapGesture .delegate = self;
doubleTapGesture .delegate = self;
实施 shouldRequireFailureOf
可防止在另一个手势识别器明确达到失败状态之前识别一个手势。
您只需要在双击失败后识别单击,这种情况发生在触摸序列仅包含一次点击时。 这可以通过以下实现来实现。
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
// Don't recognize a single tap until a double-tap fails.
if gestureRecognizer == self.tapGesture &&
otherGestureRecognizer == self.doubleTapGesture {
return true
}
return false
}
希望如此helps.Happy编码!!