iOS私有API(二) UIGestureRecognizerDelegate的两个函数

简介: UIGestureRecognizerDelegate有两个没公开的函数,只要重载了就会被调用。 即所有的UIGestureRecognizer子类.delegate = someInstance; 经过set以后,只要这个delegate实例里有这两个函数,就会被调用进入。

UIGestureRecognizerDelegate有两个没公开的函数,只要重载了就会被调用。

即所有的UIGestureRecognizer子类.delegate = someInstance; 经过set以后,只要这个delegate实例里有这两个函数,就会被调用进入。经过验证,这两个api是可以通过apple审查上app store的。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer canBePreventedByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer  
{  
    BOOL result = YES; 
// something you do  
    return result;  
}  
 
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer canPreventGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer   
{  
    BOOL result = YES; 
// something you do  
    return result;  
}  

实际上UIGestureRecognizerDelegate这个Protocol有7个函数,公开的只有3个,我目前发现UIWebView系统有使用5个。

@protocol UIGestureRecognizerDelegatePrivate <UIGestureRecognizerDelegate> 
 
@optional 
- (BOOL)_gestureRecognizer:(id)arg1 canBePreventedByGestureRecognizer:(id)arg2; 
- (BOOL)_gestureRecognizer:(id)arg1 canPreventGestureRecognizer:(id)arg2; 
- (BOOL)_gestureRecognizer:(id)arg1 shouldReceiveTouch:(id)arg2; 
- (BOOL)_gestureRecognizer:(id)arg1 shouldRecognizeSimultaneouslyWithGestureRecognizer:(id)arg2; 
- (BOOL)_gestureRecognizerShouldBegin:(id)arg1; 
- (BOOL)_gestureRecognizer:(id)arg1 shouldBeRequiredToFailByGestureRecognizer:(id)arg2; 
- (BOOL)_gestureRecognizer:(id)arg1 shouldRequireFailureOfGestureRecognizer:(id)arg2; 
@end 

使用场景:

一个view上以及其superview和subviews上有很多个gestureRecognizers时,可以使用这两个函数做手势间的互斥。如函数名那般顾名思义,返回值为第一个手势能否阻止或被阻止第二个手势的触发。

系统使用示例:

UIWebView的非公开子view,UIWebDocumentView有使用到,经反汇编,其部分实现为:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer canBePreventedByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    BOOL result = NO; 
//    有部分代码省略
    if (_longPressGestureRecognizer != gestureRecognizer && _highlightLongPressGestureRecognizer != gestureRecognizer) 
        result = YES; 
    return result; 
} 
 
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer canPreventGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    BOOL result = YES; 
//    有部分代码省略
    if (_highlightLongPressGestureRecognizer == gestureRecognizer || _longPressGestureRecognizer == gestureRecognizer) 
    { 
        Class cls = NSClassFromString(@"UIScrollViewPanGestureRecognizer"); 
        result = [otherGestureRecognizer isKindOfClass:cls] == NO; 
    } 
    return result; 
} 

目录
相关文章
|
1月前
|
缓存 JavaScript 算法
活用 Composition API 核心函数,打造卓越应用(下)
活用 Composition API 核心函数,打造卓越应用(下)
|
1月前
|
存储 JavaScript API
活用 Composition API 核心函数,打造卓越应用(上)
活用 Composition API 核心函数,打造卓越应用(上)
|
27天前
|
人工智能 关系型数据库 Serverless
Serverless 应用引擎常见问题之API生成的函数镜像改为自定义的镜像如何解决
Serverless 应用引擎(Serverless Application Engine, SAE)是一种完全托管的应用平台,它允许开发者无需管理服务器即可构建和部署应用。以下是Serverless 应用引擎使用过程中的一些常见问题及其答案的汇总:
37 3
|
26天前
|
Java 数据库连接 API
Java 学习路线:基础知识、数据类型、条件语句、函数、循环、异常处理、数据结构、面向对象编程、包、文件和 API
Java 是一种广泛使用的、面向对象的编程语言,始于1995年,以其跨平台性、安全性和可靠性著称,应用于从移动设备到数据中心的各种场景。基础概念包括变量(如局部、实例和静态变量)、数据类型(原始和非原始)、条件语句(if、else、switch等)、函数、循环、异常处理、数据结构(如数组、链表)和面向对象编程(类、接口、继承等)。深入学习还包括包、内存管理、集合框架、序列化、网络套接字、泛型、流、JVM、垃圾回收和线程。构建工具如Gradle、Maven和Ant简化了开发流程,Web框架如Spring和Spring Boot支持Web应用开发。ORM工具如JPA、Hibernate处理对象与数
90 3
|
3月前
|
缓存 JSON API
IOS网络编程:什么是 RESTful API?如何使用 RESTful 风格设计 API?
IOS网络编程:什么是 RESTful API?如何使用 RESTful 风格设计 API?
38 3
|
4月前
|
存储 API 数据安全/隐私保护
FreeRTOS入门教程(信号量的概念及API函数使用)
FreeRTOS入门教程(信号量的概念及API函数使用)
93 0
|
7月前
|
API
15-iOS之Runtime常用API以及使用
15-iOS之Runtime常用API以及使用
52 0
|
7月前
|
安全 调度 C语言
iOS多线程之GCD-同步、异步、并发、串行、线程组、栅栏函数、信号量等全网最全的总结
iOS多线程之GCD-同步、异步、并发、串行、线程组、栅栏函数、信号量等全网最全的总结
480 1
|
8月前
|
前端开发 JavaScript 定位技术
iOS 逆向编程(十六)DZMCycript 脚本使用(封装了常用的快捷函数,后续会继续添加)
iOS 逆向编程(十六)DZMCycript 脚本使用(封装了常用的快捷函数,后续会继续添加)
90 0
|
9月前
|
API
讨论问题--数据类型、数组、传值/址API函数等
讨论问题--数据类型、数组、传值/址API函数等
45 0