业务逻辑1:

        底部一个按钮, 按钮的上面有一个View,遮挡在按钮的上面.

        点击View时, View接收事件,当发现点击的点在按钮的位置时, 让底部的按钮处理事件.

        

    实现思路:

        实现View的touchBegain方法,先坚听UIView的点击.

        并去实现UIView的HitTest方法, 在hitTest方法当中通过把当前点转换成按钮所在的坐标系

              CGPoint btnP = [self convertPoint:point toView:self.btn];

           转换过后查看当前点在不在按钮上,如果在按钮上,就直接返回按钮.

           如果有在按钮上,保持系统默认做法.

        

    实现代码:

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

            判断当前点在不在按钮上.

            把当前点转换成按钮所在的坐标系

            CGPoint btnP = [self convertPoint:point toView:self.btn];

            if ([self.btn pointInside:btnP withEvent:event]) {

                return self.btn;

            }else{

               return [super hitTest:point withEvent:event];

            }

        }

业务逻辑2: 

        按钮可以随着手指拖动而拖动.拖动过程当中,按钮当中的子控件也跟着拖动.

        让超过按钮的子控件也能够响应事件,一般情况下,当一个控件超过他的父控件的时候,是不能够接收事件的. 

        现在要做的事情就让超过父控件的按钮也能够响应事件.

        

    实现思路:

        先办到让按钮能够跟随着手指移动而移动.

        实现按钮的touchesMoved方法,在touchesMoved方法当中,获得当前手指所在的点.以前上一个点.

        分别计算X轴的偏移量以及Y轴的偏移量.

        然后修改当前按钮的transform让按钮办到能够跟随着手指移动而移动.

        

        第二步, 实现按钮的hitTest方法.

        在该方法当中去判断当前的点在不在按钮的子控件上.

        如果在按钮的子控件上.就返回按钮的子控件如果不在的话, 就保持系统的默认做法.

        

    实现代码:

        第一步,让按钮能够跟随着手指移动而移动

        -(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    

            获取当前的手指

            UITouch *touch = [touches anyObject];

            获取当前手指所在的点

            CGPoint curP = [touch locationInView:self];

            获取当前手指的上一个点

            CGPoint preP = [touch previousLocationInView:self];

            计算X轴的偏移量

            CGFloat offsetX = curP.x - preP.x;

            计算Y轴的偏移量

            CGFloat offsetY = curP.y - preP.y; 

            修改按钮的形变,让按钮能够移动.   

            self.transform = CGAffineTransformTranslate(self.transform, offsetX, offsetY);    

        }

        

        第二步,实现hitTest方法,判断手指当前所在的点在不在按钮的子控件上.

        

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

            把当前所在的点转换成按钮子控件上面的点

            CGPoint chatP =  [self convertPoint:point toView:self.chatBtn];

            判断转换后的点在不在按钮的控件上.

            if ([self.chatBtn pointInside:chatP withEvent:event]) {如果在

                直接返回,也就意味着,当前最适合的View,就是这个按钮

                return self.chatBtn;

            }else{如果不在,那么就保持系统原有做法.

              return  [super hitTest:point withEvent:event];

            }

        }

hitTest练习的更多相关文章

  1. iOS Hit-Test应用

    最近又看了遍苹果的官方文档<Event Handling Guide for iOS>,对事件响应链中的hit-test view 又多了些理解,个人觉的官方文档对这块讲的非常简单,很多东 ...

  2. 【原】ios的hitTest方法以及不规则区域内触摸事件处理方法

    概述 在正常的使用场景中,我们处理了比较多的矩形区域内触摸事件,比如UIButton.UIControl.一般来说,这些控件的图形以及触摸区域都是矩形或者圆角矩形的.但是在一些特殊应用场景中我们有时不 ...

  3. 新浪微博客户端(59)-hitTest withEvent方法的使用说明

    iOS中的触摸事件总是由最顶层的View首先得到的,当这个View得到该触摸事件的时候可以选择通过 - (BOOL)pointInside:(CGPoint)point withEvent:(UIEv ...

  4. IOS第15天(2,事件处理hitTest练习)

    ***hitTest 获取最合适的点 @implementation HMGreenView - (void)touchesBegan:(NSSet *)touches withEvent:(UIEv ...

  5. 设置完在Canvas的位置后,控件HitTest不响应的问题

    have a Canvas with a couple of elements on it like Line, Path and Text Box. In the MouseOver event o ...

  6. hitTest:WithEvent 和Responder Chain

    这个方法是找到那个View被touch,当找到后就成为响应链的第一个了,如果他不能处理这个Event,那么就找nextResponder 直至application 如果不能处理,那就会丢弃掉. ht ...

  7. hitTest方法与PointInside方法

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

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

    在有全屏侧滑的情况下,页面上有个slider需要左右滑动的时候,经常在滑动slider的时候页面也跟着滑动                解决办法一:关闭当前页面的全屏侧滑,开启系统侧滑   self ...

  9. 消息点击事件的响应链---hitTest:withEvent:方法

    *当用户点击屏幕时,会产生一个触摸事件,系统会将触摸事件加入到 UIApplication管理事件队里中 *UIApplication 会从事件队列中取出最前面的事件进行分发以便处理,通常,先发送事件 ...

  10. 第七篇、hitTest UITabbar中间突出按钮额外增加可点击区域

    简介: 以前UITabbar使用中间有一个凸起按钮时,常常就需要用到hitTest来处理可点击的范围. 示例代码: - (UIView *)hitTest:(CGPoint)point withEve ...

随机推荐

  1. 使用 JavaScript 中的 document 对象查找 HTML 元素,实现“登录”按钮的高亮特效 鼠标悬浮于“登录”按钮时,按钮高亮显示;

    查看本章节 查看作业目录 需求说明: 使用 JavaScript 中的 document 对象查找 HTML 元素,实现"登录"按钮的高亮特效 鼠标悬浮于"登录" ...

  2. SpringBoot集成MyBatis-Plus框架详细方法

    1.说明 本文详细介绍Spring Boot集成MyBatis-Plus框架的方法, 使用MySQL数据库进行测试, 包括完整的开发到测试步骤, 从一开始的Spring Boot工程创建, 到MySQ ...

  3. centos6.5搭建Apache-虚拟主机

    一.配置基于域名的虚拟用户 1.创建虚拟用户的网页根目录 cd /usr/local/httpd/htdocs/ mkdir benetcom cd benetcom echo "<h ...

  4. CF858D Polycarp's phone book

    题意翻译 有 n 个长度为 9 且只包含数字字符互不相同的串. 需要对于每个串找到一个长度最短的识别码,使得这个识别码当且仅当为这个串的子串. 题目分析 因为范围不是非常大,所以可以将子串筛出来 然后 ...

  5. CentOS7中安装pip的方法

    1.安装epel-release [root@localhost ~]# yum -y install epel-release 2.安装python-pip [root@localhost ~]# ...

  6. react中使用immutable

    官方文档(https://immutable-js.github.io/immutable-js/docs/#/) 有人说 Immutable 可以给 React 应用带来数十倍的提升,也有人说 Im ...

  7. C# 开源一个基于 yarp 的 API 网关 Demo,支持绑定 Kubernetes Service

    关于 Neting 刚开始的时候是打算使用微软官方的 Yarp 库,实现一个 API 网关,后面发现坑比较多,弄起来比较麻烦,就放弃了.目前写完了查看 Kubernetes Service 信息.创建 ...

  8. 【原创】美团二面:聊聊你对 Kafka Consumer 的架构设计

    在上一篇中我们详细聊了关于 Kafka Producer 内部的底层原理设计思想和细节, 本篇我们主要来聊聊 Kafka Consumer 即消费者的内部底层原理设计思想. 1.Consumer之总体 ...

  9. 《剑指offer》面试题10- II. 青蛙跳台阶问题

    问题描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少种跳法. 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008, ...

  10. 《剑指offer》面试题39. 数组中出现次数超过一半的数字

    问题描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, ...