我想在基于视图的iPhone项目中添加简单的滑动手势识别.应该识别所有方向(右、下、左、上)的手势.

UISweepGestureRecognizer的文档中规定:

可以通过使用按位或操作数指定多个UISwipeGestureRecognizerDirection常量来指定多个方向.默认方向为UISwipeGestureRecognizerDirectionRight.

然而,对我来说,这是行不通的.当对所有四个方向进行"或"运算时,只能识别向左和向右的滑动.

- (void)viewDidLoad {
    UISwipeGestureRecognizer *recognizer;

    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionUp)];
    [[self view] addGestureRecognizer:recognizer];
    [recognizer release]; 
    [super viewDidLoad];
}

-(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer {
    NSLog(@"Swipe received.");
}

我在视图中添加了四个识别器来修复这个问题,但是我很好奇为什么它没有像文档中宣传的那样工作?

- (void)viewDidLoad {
    UISwipeGestureRecognizer *recognizer;

    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
    [[self view] addGestureRecognizer:recognizer];
    [recognizer release];

    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionUp)];
    [[self view] addGestureRecognizer:recognizer];
    [recognizer release];

    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionDown)];
    [[self view] addGestureRecognizer:recognizer];
    [recognizer release];

    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];
    [[self view] addGestureRecognizer:recognizer];
    [recognizer release];

    [super viewDidLoad];
}

-(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer {
    NSLog(@"Swipe received.");
}

推荐答案

好像有个窃听器.您可以像以前一样指定允许的方向.但是,当您try 访问触发动作 Select 器方法中滑动的actual方向时,您仍然会得到最初设置的位掩码(对于允许的方向).

这意味着当允许多个方向时,对实际方向的判断将始终失败. 当您在 Select 器方法(即-(void)scrollViewSwiped:(UISwipeGestureRecognizer *)recognizer)中输出"方向"的值时,您可以很容易地自己看到它.

已向苹果提交错误报告(#8276386).

[更新版]我从苹果公司得到了回复,说这种行为是按预期进行的.

例如,在表格视图中,您可以在表格视图单元格中向左或向右滑动以触发"删除"(这将使滑动手势的方向设置为向左和向右)

这意味着最初的变通方法就是它应该被使用的方式.direction属性只能用于正确识别手势,但不能用于在成功识别时执行的方法中,以比较触发识别的实际方向.

Ios相关问答推荐

使用UIGraphicsBeginIMAext创建新图像会扭曲图像 colored颜色

使用CGAffineTransform旋转视图只起作用一次吗?

SwiftUI中的视频时间轴

Xcode 15模拟器用x86_64编译

如何在后台显示 Swift UI 中的通讯通知?

如何从单独的视图更改修饰符的值

表视图(SwiftUI)中的多列?

NSOperation 有延迟 - 它是异步的还是同步的?

叠加视图不在堆栈中维护自身 - SwiftUI

SwiftUI Select 器值在超过最大值时重置

帧过渡动画有条件地工作

clipShape swift的三元

SwiftUI:如何用拇指移动滑块值

如何识别 SwiftUI 中点击的按钮 ID 以使该按钮动画化?

如何在保持纵横比的同时zoom UIView 的内容以适应目标矩形?

如何关闭情节提要弹出框

向标签栏控制器添加新标签

是否可以在 iOS 9 上让您的 iPad 应用退出多任务处理?

如何隐藏uitabbar控制器

核心数据 - 无法在路径加载优化模型