hitTest练习

业务逻辑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];
            }
        }

时间: 2024-11-09 07:45:28

hitTest练习的相关文章

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

*当用户点击屏幕时,会产生一个触摸事件,系统会将触摸事件加入到 UIApplication管理事件队里中 *UIApplication 会从事件队列中取出最前面的事件进行分发以便处理,通常,先发送事件给应用程序主窗口(UIwindow0 *主窗口会调用 hitTest:withEvent:方法在视图(UIView)层次结构中找到一个最合适的 UIView来处理触摸事件 (hitTest:LwithEvent:其实是 UIView 的一个方法UIWindow 继承自 UIView,因此主窗口UIW

模拟UIView的hitTest:方法和pointInside:方法的实现

对于UIView 的两个方法的讲解: - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 网上对这两个方法的讲解很多,但是大部分是纯文字的描述,我不再赘述,需要可以自己百度"UIView hitTest"等等. 我现在根据我的理解,把这两个方法的源码实现模拟出来. 注意:这里只是模拟,是为了让

UIView利用hitTest添加点击事件

UIView利用hitTest添加点击事件 by 伍雪颖 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { CGPoint point = [[touches anyObject] locationInView:self.view]; CALayer *layer = [self.view.layer hitTest:point]; if (layer == self.blueView.layer) { [[[U

hitTest方法与PointInside方法

作用:寻找最适合的View     参数:当前手指所在的点.产生的事件     返回值:返回谁, 谁就是最适合的View.     什么时候用调用:只要一个事件,传递给一个控件时, 就会调用这个控件的hitTest方法     -(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event          作用:判断point在不在方法调用者上     point:必须是方法调用者的坐标系     什么时候调用:hitTest方法底层会

第七篇、hitTest UITabbar中间突出按钮

简介: 以前UITabbar使用中间有一个凸起按钮时,常常就需要用到hitTest来处理可点击的范围. 示例代码: - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { UIView *hitView = nil; //NSLog(@"point:%@", NSStringFromCGPoint(point)); UIButton *roundBtn = (UIButton *)[self viewWithTag

hitTest和pointInside如何响应用户点击事件

http://www.superqq.com/blog/2015/04/23/iosyong-hu-dian-ji-shi-jian-chu-li/ 处理机制 iOS事件处理,首先应该是找到能处理点击事件的视图,然后在找到的这个视图里处理这个点击事件. 处理原理如下: • 当用户点击屏幕时,会产生一个触摸事件,系统会将该事件加入到一个由UIApplication管理的事件队列中 • UIApplication会从事件队列中取出最前面的事件进行分发以便处理,通常,先发送事件给应用程序的主窗口(UI

事件分发机制Hit-Test View的应用(TabBar凸起不能点击解决方法)

一.事件分发原理 --- hitTest:withEvent:方法大致处理流程是这样的: 首先调用当前视图的pointInside:withEvent:方法判断触摸点是否在当前视图内: -- 若pointInside:withEvent:方法返回NO,说明触摸点不在当前视图内,则当前视图的hitTest:withEvent:返回nil -- 若pointInside:withEvent:方法返回YES,说明触摸点在当前视图内,则遍历当前视图的所有子视图(subviews),调用子视图的hitTe

ios开发事件处理之 四:hittest方法的底层实现与应用

#import "XMGWindow.h" /** 1:注意点:hitTest方法内部会调用pointInside方法,询问触摸点是否在自己身上,当遍历子控件时,传入的坐标点要进行转化,将父视图上的坐标点转换到所要传递的子视图上的坐标点 2:hitTest的底层实现:当控件接收到触摸事件的时候,不管能不能处理事件,都会调用hitTest方法,此方法的底层实现是:1:先看自己是否能接受触摸事件 2:再看触摸点是否在自己身上 3:从后往前遍历子控件,拿到子控件后,再次重复1,2步骤,要把父

iOS Hit-Test应用

最近又看了遍苹果的官方文档<Event Handling Guide for iOS>,对事件响应链中的hit-test view 又多了些理解,个人觉的官方文档对这块讲的非常简单,很多东西都是点到为止,hit-test view的知识在项目的任何地方都用到了,但自己反而感知不到,接下来我会给大家讲hit-test view的项目中能解决痛点的三个应用 . 什么叫 hit-test view?文档说:The lowest view in the view hierarchy that cont