核心1. 介绍

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event point :

在接收器的局部坐标系(界)中指定的点。 event : 系统保证调用此方法的事件。

如果从事件处理代码外部调用此方法,则可以指定nil。 returnValue : 视图对象是当前视图和包含点的最远的后代。

如果点完全位于接收方的视图层次结构之外,则返回nil。

目的在于 : 在视图的层次结构中寻找一个最适合的 view 来响应触摸事件。

核心2.

调用顺序:touch -> UIApplication -> UIWindow -> UIViewController.view -> subViews -> ....-> 合适的view

事件传递顺序:view -> superView ...- > UIViewController.view -> UIViewController -> UIWindow -> UIApplication -> 事件丢弃

扩展1. subview超出fatherView的bounds仍然需要响应点击事件

/*

Case1: 点击button1 & button2 不在self的区域都有效

*/

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

//1.判断自己能否接收事件

if(self.userInteractionEnabled == NO || self.hidden == YES || self.alpha <= 0.01) {

return nil;

}

// 这里无需判断point是否在父View的bounds内,因为middleButton和rightButton部分区域超出的父View

for (UIView *subview in [self.subviews reverseObjectEnumerator]) {

CGPoint convertedPoint = [subview convertPoint:point fromView:self];

UIView *hitTestView = [subview hitTest:convertedPoint withEvent:event];

if (hitTestView) {

return hitTestView;

}

}

return self;

}

/*

Case2: 点击button1不在self的区域《无》效

点击button2不在self的区域《有》效

*/

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

//1.判断自己能否接收事件

if(self.userInteractionEnabled == NO || self.hidden == YES || self.alpha <= 0.01) {

return nil;

}

CGPoint newPoint = [self convertPoint:point toView:button2];

if ([button2 pointInside:newPoint withEvent:event]) {

return button2;

}

return [super hitTest:point withEvent:event];

}

参考资料:https://blog.csdn.net/qq_18505715/article/details/78411052

转载于:https://www.cnblogs.com/madaha/p/9685180.html

ios hitTest及扩展---分解ZFPlayer相关推荐

  1. ios 手势交互控制---分解ZFPlayer

    核心1. 多种手势嵌套 单击:UITapGestureRecognizer *singleTap;   // 一般处理 播放控制页面显示/隐藏 双击:UITapGestureRecognizer *d ...

  2. ios 按位运算---分解ZFPlayer

    按位与&(位运算时,相同为1,不同为0) 按位或 |(位运算时,有1为1,全0为0) 按位异或 ^(位运算时,相同为0,不同为1) 按位取反~(0变1,1变0) 左移<  把整数a的各二 ...

  3. ios 视频列表处理---分解ZFPlayer

    1.视频播放器添加到containerView的机制与一个普通播放器页面的不同 普通视频播放页面可以直接添加一个播放器,按照正常逻辑播放.暂停.切换等操作,而视频列表的做法是 用户触发播放动作 当点击 ...

  4. 开发腾讯移动游戏平台SDK ios版Ane扩展 总结

    本文记录了在开发 腾讯移动游戏平台SDK(MSDK) ios版Ane扩展 过程中所遇到的问题 文中非常多问题都是基础的问题.对object c和xcode配置了解不深入导致的.(没办法,开发ane的程 ...

  5. iOS学习系列 - 扩展机制category与associative

    iOS学习系列 - 扩展机制category与associative category与associative作为objective-c的扩展机制的两个特性,category即类型,可以通过它来扩展方 ...

  6. iOS App添加扩展App Extension

    主要参考文章 :  https://www.cnblogs.com/fengmin/p/6118592.html demo地址,里面额外添加了一个分享的扩展 :  https://github.com ...

  7. WWDC 2014 Session笔记 - iOS 通知中心扩展制作入门

    转自:http://onevcat.com/2014/08/notification-today-widget/ 总览 扩展 (Extension) 是 iOS 8 和 OSX 10.10 加入的一个 ...

  8. iOS 通知中心扩展制作入门

    from:http://onevcat.com/2014/08/notification-today-widget/ 扩展 (Extension) 是 iOS 8 和 OSX 10.10 加入的一个非 ...

  9. iOS开发--iOS通知中心扩展制作入门(iOS Extensions)

    个人笔记: 通知中心扩展,相当于一个特殊的独立的App存在.他和主App之间通讯可以通过OpenURL来实现.而在通知中心内部,像App一样,该咋样还是咋样(如异步网络请求, 自动布局等).  之所以 ...

最新文章

  1. 引用计数(Reference Counting)和代理(Proxy)的应用
  2. 如何提高创作型任务的效率?
  3. CodeForces 811B Vladik and Complicated Book
  4. Mixing ASP.NET MVC and Webforms
  5. IBM HTTP Server Websphere Plugin
  6. *【CF#633B】 A Trivial Problem(二分或枚举)
  7. c语言08,标准C语言08_01.doc
  8. shell字符串长度
  9. init_MUTEX被废除
  10. bzoj2655 calc
  11. MT4外汇操盘跟单软件
  12. 抄书——最优化的理论与方法(5)——数学基础(凸集和凸函数)
  13. java打印ascii码_JAVA实现打印ascii码表代码
  14. いろいろな%前端开发面试题% 读后感
  15. [转]计算机编程语言的入门学习
  16. 优锘科技:数字孪生为何大爆发?
  17. gvim for verilog简易配置
  18. 单连通图(算法导论22.3-12)
  19. linux远程桌面方式,Linux 远程桌面的两种方式
  20. kaggle可插拔tta应用记录

热门文章

  1. WITH AS【原创】
  2. FusionCharts Free(3)
  3. 黄金——家家都应藏有的投资品(转载自新浪)
  4. 华为机器狗 VS 波士顿狗,谁更胜一筹?
  5. idea中刷新项目快捷键_解决 IDEA 使用过程中让你觉得不爽的一些问题
  6. centos安装python3小白_Centos7 安装Python3
  7. Java---模拟图灵机的运行过程
  8. python3.7界面设计_基于selenium+Python3.7+yaml+Robot Framework的UI自动化测试框架
  9. JSP页面中<%!%>与<%%>与<%=%>
  10. 【Spring注解】@Condition条件注册