UIGestureRecognizer 的共存

2024-04-01 09:38

本文主要是介绍UIGestureRecognizer 的共存,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在 iPhone 或 iPad 的開發中,除了用 touchesBegan / touchesMoved / touchesEnded 這組方法來控制使用者的手指觸控外,也可以用 UIGestureRecognizer 的衍生類別來進行判斷。用 UIGestureRecognizer 的好處在於有現成的手勢,開發者不用自己計算手指移動的軌跡。UIGestureRecognizer的衍生類別有以下數種:

  • UITapGestureRecognizer
  • UIPinchGestureRecognizer
  • UIRotationGestureRecognizer
  • UISwipeGestureRecognizer
  • UIPanGestureRecognizer
  • UILongPressGestureRecognizer

從命名上不難了解這些類別所對應代表的手勢,分別是 Tap(點一下)、Pinch(二指往內或往外撥動)、Rotation(旋轉)、Swipe(滑動,快速移動)、Pan (拖移,慢速移動)以及 LongPress(長按)。這些手勢類別在使用上也很簡單,只要在使用前宣告並掛到對應的視圖(UIView)元件上即可。

     
// 宣告一個 recognizer, 並加到需要偵測該手勢的 UIView 元件上
- (void)viewDidLoad {
UISwipeGestureRecognizer* recognizer;
// handleSwipeFrom 是偵測到手勢後,所要呼叫的方法
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom)];
// 不同的 Recognizer 有不同的實體變數
// 例如 SwipeGesture 可以指定方向
// 而 TapGesture 則可以指定次數
recognizer.direction = UISwipeGestureRecognizerDirectionUp
[self.view addGestureRecognizer:recognizer];
[recognizer release];
}
- (void)handleSwipeFrom:(UISwipeGestureRecognizer*)recognizer {
// 觸發手勢事件後,在這裡作些事情
// 底下是刪除手勢的方式
[self.view removeGestureRecognizer:recognizer];
}
view raw uigesturerecognizer.m This Gist brought to you by  GitHub.

問題來了。有些手勢其實是互相關連的,例如 Tap 與 LongPress、Swipe 與 Pan,或是 Tap 一次與 Tap 兩次。當一個 UIView 同時掛上兩個相關連的手勢時,到底我這一下手指頭按的要算是 Tap 還是 LongPress?如果照預設作法來看,只要「先滿足條件」的就會跳出並呼叫對應方法,舉例來說,如果同時註冊了 Pan 跟 Swipe,只要手指頭一移動就會觸發 Pan 然後跳出,因而永遠都不會發生 Swipe;單點與雙點的情形也是一樣,永遠都只會觸發單點,不會有雙點。

那麼這問題有解嗎?有的, UIGestureRecognizer 有個方法叫做 requireGestureRecognizerToFail,他可以指定某一個 recognizer,即便自己已經滿足條件了,也不會立刻觸發,會等到該指定的 recognizer 確定失敗之後才觸發。以同時支援單點擊與雙點擊的作法為例,程式碼如下:

     
- (void)viewDidLoad {
// 單擊的 Recognizer
UITapGestureRecognizer* singleRecognizer;
singleRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTapFrom)];
singleTapRecognizer.numberOfTapsRequired = 1; // 單擊
[self.view addGestureRecognizer:singleRecognizer];
// 雙擊的 Recognizer
UITapGestureRecognizer* double;
doubleRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTapFrom)];
doubleTapRecognizer.numberOfTapsRequired = 2; // 雙擊
[self.view addGestureRecognizer:doubleRecognizer];
// 關鍵在這一行,如果雙擊確定偵測失敗才會觸發單擊
[singleRecognizer requireGestureRecognizerToFail:doubleRecognizer];
[singleRecognizer release];
[doubleRecognizer release];
}
view raw uitapgesturerecognizer.m This Gist brought to you by  GitHub.

如此一來,在第一下點擊後,如果有迅速點擊第二下,就會觸發  doubleRecognizer;反之要是隔了一小段時間,造成  doubleRecognizer 發生 fail,就會回頭觸發 singleRecognizer 了。

这篇关于UIGestureRecognizer 的共存的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/866819

相关文章

Windows 安装mysql 教程,mysql 多版本共存教程,傻瓜式安装教程

mysql 各版本官方下载地址:⬇ ⬇⬇⬇⬇⬇⬇⬇⬇⬇(点击下面链接前往)MySQL :: Download MySQL Community Server (Archived Versions)https://downloads.mysql.com/archives/community/  首先我本地安装了 mysql8.0版本了,通过msi 进行安装的也就是傻瓜式的点点。这里就不介绍了

Java使用类加载器解决类冲突,多版本jar共存

Java使用类加载器解决类冲突 1、案例说明2、打包新版本POI并将要调用的方法封装2.1、POM文件2.2、封装的方法 3、要使用多个POI版本的项目3.1、打包前面的项目生成一个jar包3.1、POM文件3.2、类加载器代码3.3、Jar加载工具3.4、最终调用 1、案例说明 项目中已经有了一个旧版本的poi库,并且这个库的版本无法修改,现在需要引入新版本的poi库,调用其

BBR 与 AIMD 共存公平性探究

一个古已有之的结论: deep buffer 场景,bbr 相对 reno/cubic 等 aimd 有优势,侵占性强;shallow buffer 场景,aimd 有优势,bbr 带宽被挤占。 本文用实例分析 why 并给出 how。 先看 deep buffer 场景 bbr 单挑 aimd 双流的效果,下图是标准 bbr,被虐成经理: 下图是用 max(bw/delay) 替代 ma

「OC」剪不断,理还乱——UIResponder、UIGestureRecognizer、UIControl的响应优先级探究

「OC」剪不断,理还乱——UIResponder、UIGestureRecognizer、UIControl的响应优先级探究 文章目录 「OC」剪不断,理还乱——UIResponder、UIGestureRecognizer、UIControl的响应优先级探究前言介绍UIResponderUIGestureRecognizerUIControl 正文UIGestureRecognizer和

CANoe入门(四) :全真实节点阶段和真实节点和部分仿真节点共存阶段,读取和模拟数据

1. 前言 前篇文章我们在CANoe全仿真阶段,模拟数据和信号。这篇文章,我们来看下全真实节点阶段和真实节点和部分仿真节点共存阶段,怎么读取数据信号,和模拟发送数据信号。 2. 全真实节点阶段 全真实节点阶段,所有的 ECU 都是真实的,也就是要去实车上。 这时CANoe 主要用于监测和分析总线通信。可以在出现问题时读取信号,进行故障诊断和排除。 2.1 新建项目 新建一个CANoe

python2和python3的共存问题

第一次写博客,可能有点乱,还望大家多多见谅,不对的话请各位大神帮忙指正~~~ 我的电脑系统环境情况如图所示,win10专业版64位,同时在C盘安装了python3.6和python2.7两个版本(还有一个Anaconda3的以后再解释,这里不影响)安装python的教程以后有时间我会写一下,不会的话可以看下别人的教程,这里暂时不再赘述,这里主要讲python3和python2的共存问题。

spring 注解 事务,声明事务共存 order 方案---有bug

一、背景 spring 注解事务和声明事务共存下,出现一些奇怪的问题,声明事务不生效啦!本来对于业务异常不进行回滚,最终回滚啦,很是奇怪啊,调查了一下,进行了一些了解,最后才有这篇文章。 参考: https://blog.csdn.net/feng27156/article/details/8740223 二、配置 1、修改之前的配置 <bean id="transac

读AI新生:破解人机共存密码笔记09精神安全权

1. 自动化史塔西 1.1. 作恶的创新也在快速发展 1.1.1. 心怀恶意的人们正在迅速地想出滥用人工智能的新方法 1.2. 史塔西(Stasi)是得意智皿煮国和共家国部全安更广为人知的名字,它被广泛认为是“有史以来最高效、最具性压镇的报情和秘密惊诧构机之一” 1.2.1. 保存着皿煮DE国绝大多数家庭的档案 1.2.2. 它的惯用手法是心理吓恐,而不是禁监或决处 1.2.3.

读AI新生:破解人机共存密码笔记08超级智能

1. 发现动作 1.1. 时间跨度长的智能行为,需要具备在多个抽象层次上分层规划和管理活动的能力,从攻读博士学位(可能涉及1万亿个动作),到给一根手指发送一个运动控制指令,从而键入求职信的字符,无所不包 1.2. 随着时间的推移,未来越来越接近现在,计划变得越来越详细 1.2.1. 新的、模糊的计划可能会添加到遥远的未来之中 1.2.2. 不久之后的未来计划会变得非常具体,可以由运动控

读AI新生:破解人机共存密码笔记06人工智能生态系统

1. 深蓝 1.1. “深蓝”的胜利虽然令人印象深刻,但它只是延续了几十年来显而易见的趋势 1.2. 国际象棋算法的基本设计是由克劳德·香农在1950年提出的 1.2.1. 这一基本设计在20世纪60年代初实现了重大改进 1.2.2. 最优秀的国际象棋程序的等级评分稳步提高,这主要是因为计算机速度更快,让程序能够算到未来更远处 1.2.3. 从1994年开始推算,系统预测计算机将会在