一起识别长按和平移手势识别器

2024-03-09

我有一个视图,其中添加了平移和长按 UIGestureRecognizer。平移用于移动视图。我想做的是还要注意触摸已停止移动(同时保持活动状态)并触发长按。

我发现平底锅开始后长按永远不会被触发。我尝试设置委托并实施:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    NSLog(@"simultaneous %@", gestureRecognizer.class);
    return YES;
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    NSLog(@"require fail %@", gestureRecognizer.class);

    return [gestureRecognizer isKindOfClass:[UIPanGestureRecognizer self]];
    // also tried return YES;
    // also tried return [gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer self]];
}

我尝试过愚弄 pan gr 的 allowedMovement,也无济于事。我正打算放弃并在 pan gr 中使用一个计时器,该计时器会失效,然后在移动时重置,但我希望 SDK 能为我做状态机的事情。


如果其他人需要它,这里是适合我的代码。目标是获得对长按和平移敏感的视图,包括长按之前没有平移的视图,反之亦然。

// setup
@property (strong,nonatomic) NSTimer *timer;          // triggers the long press during pan
@property (strong,nonatomic) UIView *longPressView;   // need this to track long press state

// view is the view we're interested in panning and long pressing
UIPanGestureRecognizer *panGR = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGR:)];
[view addGestureRecognizer:panGR];

// this starts a long press when no pan has occurred
UILongPressGestureRecognizer *longGR = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressGR:)];
[view addGestureRecognizer:longGR];

当平底锅开始或发生变化时,启动计时器。如果计时器在平移结束之前到期(触摸释放),那么我们可以长按。

- (void)panGR:(UIPanGestureRecognizer *)gr {
    if (gr.state == UIGestureRecognizerStateBegan) {
        [self startTimer:gr.view];
    } else if (gr.state == UIGestureRecognizerStateChanged) {
        [self startTimer:gr.view];

        // do whatever you want to do with pan state in this method
        // in my case, I'm translating the view here

    } else if (gr.state == UIGestureRecognizerStateEnded) {
        if (self.longPressView) {
            [self longPressEnded];
        } else {
            [self.timer invalidate];
        }
    }
}

我们为计时器提供视图的用户信息。您可能需要存储手势状态的其他部分,例如位置等。使用用户信息字典以相同的方式进行操作。

- (void)startTimer:(UIView *)view {
    if (self.longPressView) return;
    [self.timer invalidate];
    self.timer = [NSTimer scheduledTimerWithTimeInterval:0.8 target:self
                                                selector:@selector(longPressTimer:)
                                                userInfo:@{ @"view": view} repeats:NO];
}

-(void)longPressTimer:(NSTimer *)timer {

    self.longPressView = timer.userInfo[@"view"];
    [self longPressBegan];
}

由于计时器方法没有关联的 gr,因此请分解出我们通常放入 gr 处理程序中的所有逻辑,以便计时器处理程序和 gr 处理程序都可以调用它。

- (void)longPressGR:(UILongPressGestureRecognizer *)gr {

    if (gr.state == UIGestureRecognizerStateBegan) {
        self.longPressView = gr.view;
        [self longPressBegan];
    } else if (gr.state == UIGestureRecognizerStateEnded) {
        [self longPressEnded];
    }
}

- (void)longPressBegan {
    NSLog(@"long press began");
}

- (void)longPressEnded {

    self.longPressView = nil;
    NSLog(@"long press ended");
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一起识别长按和平移手势识别器 的相关文章

随机推荐

  • 如果一个点位于相机视野之外,Three.js 行就会消失

    我按照文档中的说明创建了一行 http trijs org docs Reference Objects Line http threejs org docs Reference Objects Line 但是 当其中一个线点位于相机视野之
  • RSA 身份验证代理 API 文档中的函数签名是否正确?

    我有一些使用 RSA 身份验证代理记录的 API 的软件 该产品作为服务在域中的客户端计算机上运行 并通过与集中安装的 RSA 身份验证管理器 通信来对本地用户进行身份验证 身份验证代理的 API 公开记录在此处 适用于 C 开发人员指南的
  • 调用未定义函数create_function

    我尝试激活已安装的插件 但收到此错误 我无法再次打开该网站 我重新启动计算机并加载本地主机 URL 得到以下相同的错误 致命错误 未捕获错误 调用 C xampp htdocs university wp content plugins f
  • 未处理的侏儒表情

    谁能告诉我以下分段错误到底是什么意思 Unhandled dwarf expression opcode 0x93 它在Solaris 10 i386 上 任何建议表示赞赏 如果您的 GDB 版本太旧 比生成代码的编译器旧 则可能会出现此类
  • 将 r 与 anova 一起替换

    我尝试对不同的数据集运行方差分析 但不太知道该怎么做 我搜索了一下 发现这个很有用 https stats idre ucla edu r codefragments looping strings https stats idre ucl
  • 将新图像添加到资源文件夹后出现类未找到异常

    该应用程序在模拟器和设备上运行得非常好 添加一组新图像后 它开始在每次运行时 在模拟器上和在设备上显示类未找到异常 当尝试删除一些图像以查找原因时 我在运行时找不到不同的类 编译和打包应用程序不会生成警告或错误 他们甚至得到签名 我得到的一
  • PHP 无法将包含 PHP 代码的文件读取为文本文件

    我偶然发现了以下特点 handle fopen realpath folder files php r 无法读取文件 但是一旦我从文件中删除 php 标签 它变得可读 并且我的脚本在页面上打印非空文件内容 另外 file php 永远不会被
  • jQuery $(document).ready() 未触发

    使用 Google 托管代码中的 jQuery 1 4 2 当文档准备好时 以下 javascript 没有触发所有 3 个 document ready 函数是否有原因 首先 document ready 函数 它呈现标题 第二个函数 它
  • 我可以使用 AJAX“POST”将数据发布到服务器上的 JSON 文件吗?

    我只想要最简单 最简单的方法 使用 POST 用户在我的服务器上输入的数据从 AJAX 表单获取数据 因此 如果用户在页面的输入表单中留下他们的姓名 则 AJAX POST 会将数据发送到我的服务器上的 JSON 文件中 这可能吗 这是获取
  • unixodbc 驱动程序管理器无法在安装时打开指定的库

    我正在使用 ArchLinux 并且正在尝试安装 OpenEdge 进度驱动程序 以便我可以通过 PHP 访问它 我已经安装了 unixodbc 软件包和驱动程序 但是当我通过 isql 或 PHP 测试连接时 出现相同的错误 isql 3
  • AngularJS ng-src 图像路径

    关于使用ng src为了显示图像 此代码在运行时起作用 但在初始页面加载时不起作用 div class imageHolder img div class caption Click to configure div div 在我的初始页面
  • Rest JAX-RS异常,未找到MessageBodyWriter

    我正在使用泽西岛2 13 当我尝试通过浏览器中的 url 访问资源时 出现 MessageBoddyWriter not found 异常 例外 MessageBodyWriter not found for media type appl
  • Julia:如何在宏中使用 kwargs...?

    说我想要 fn a b c sort true 扩展到 gn a b c sort true 目前 我将其写为 macro fn x args kwargs esc gn x args kwargs end 这似乎不起作用 我如何扩展kwa
  • 打开街道地图 (osmdroid) 在 PC 中显示灰色瓷砖而不是地图

    我正在使用 osmdroid 在我的应用程序中获取开放的街道地图 我已经使用所需的 jar osmdroid 构建了我的项目 并在清单中添加了所有需要的权限 但是当我尝试在 android 模拟器 adt eclipse 中调试我的应用程序
  • mysqli_select_db() 期望参数 1 为 mysqli,给定字符串

    我是 Mysqli 新手 收到以下错误 警告 mysqli select db 期望参数 1 为 mysqli 字符串 在 D Hosting 9864230 html includes connection php 第 11 行给出 警告
  • 使用 IMAGE_FILE_LARGE_ADDRESS_AWARE 32 位 - 64 位

    我昨天了解到在 DelphiXE 中使用编译器指令 SetPEFlags IMAGE FILE LARGE ADDRESS AWARE 即使 DelphiXE 编译器生成 32 位代码 您也可以在 64 位计算机上访问 使用 4GB 地址空
  • 在 netbeans 7.0.1 中找不到 web.xml

    我想将文件上传到服务器 为此我正在编写一个 servlet 程序 上传文档的目录位置应从 web xml 中的参数获取 我以前没有使用过 web xml 只知道它为每个 servlet 生成条目 我无法在我在 netbeans 中制作的 W
  • SQLite 插入或替换位置

    我有一个包含 3 列的表 ID 描述和键 其中 ID 不是主键 我想要的是插入或更新 替换当前记录 例子 解密密钥 ID 描述 密钥 999 生日 1988 年 12 月 24 日 我尝试了这个 但它不起作用 INSERT OR REPLA
  • 如何从 JavaPairRDD 中选择前 N 个元素? -阿帕奇火花

    我已经获得了一个键 值对 并将其排序到一个新的JavaPairRDD中 现在 我需要从中选择前 5 个元素 即获取一个新的 JavaPairRDD 其中包含前 5 个元素 我该怎么做呢 有没有比使用 flatMap 更简单的方法 因为它似乎
  • 一起识别长按和平移手势识别器

    我有一个视图 其中添加了平移和长按 UIGestureRecognizer 平移用于移动视图 我想做的是还要注意触摸已停止移动 同时保持活动状态 并触发长按 我发现平底锅开始后长按永远不会被触发 我尝试设置委托并实施 BOOL gestur