iOS-hitTest方法的底层实现(超出父View响应事件、扩大view响应事件、转移事件响应顺序)

1.原理底层伪代码

 2: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];

    }

}



注意:在storyBoard中定义了view和按钮,view自定义可以拖线到自定义的view中,前提是得进行类的关联,但是button不能拖入,因为button不属于view的子控件,解决:可以在view中属性定义IBOutlet,在拖线到storyBoard中的按钮,这样就在view中拿到了不属于view的button

2:hitTest练习2

业务逻辑:

按钮可以随着⼿手指拖动⽽而拖动.拖动过程当中,按钮当中的⼦子控件也跟着拖动. 让超过按钮的⼦子控件也能够响应事件,⼀一般情况下,当⼀一个控件超过他的⽗父控件的时候,是不能 够接收事件的.

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




一般情况下,当⼀一个控件超过他的⽗父控件的时候,是不能 够接收事件的.原因是:

1:当产生触摸事件后,系统会将触摸事件发送到由UIApplication管理的事件队列中,UIApplication会将队列中最前端的事件取出来交给keywindow去处理,主窗口keywindow会1:查看自身能不能接受触摸事件 

2:触摸点是不是在自身上 

 3:若是前两个条件都满足则其会遍历自身的子控件,且是从后到前遍历,也就是从子控件数组的最后一个控件开始遍历,再执行前两个步骤,若是不在,则遍历下一个子控件,若是一直没找到,则自己就是最合适处理事件的view,若在,则继续重复前两个步骤,直到找到最合适的view。

当点击按钮的时候window将事件传递到白色view,白色view从后往前遍历子控件,先遍历蓝色的button,再遍历点击对话框,找到适合处理事件的view。当子控件超出父控件的范围后,点击子控件时不会响应事件,原因是:当遍历到父控件点击对话框时,触摸点不再其身上,则其就不会响应事件

实现思路:

第一步,先办到让按钮能够跟随着⼿手指移动⽽而移动. 实现按钮的touchesMoved⽅方法,在touchesMoved⽅方法当中,获得当前⼿手指所在的点.以前上一 个点.一个手指对应一个UITouch对象,一个手指取出UITouch,anyobject,若是多根手指则会touch.allobjects获取所有的UITouch对象,分别计算X轴的偏移量以及Y轴的偏移量. 然后修改当前按钮的transform让按钮办到能够跟随着⼿手指移动⽽而移动(累加形变).

第二步,

1: 实现按钮的hitTest⽅法. 在该方法当中去判断当前的点在不在按钮的⼦控件上. 如果在按钮的⼦控件上.就返回按钮的子控件,如果不在的话, 就保持系统的默认做法.一般在父类中重写hitTest方法,修改返回最合适的view

 2:self.chatBtn.btn定义为弱引用, self.chatBtn.btn = btn赋值指针地址,弱引用指向该对象,[self.chatBtn addSubview:btn];强引用引用着btn使其不被销毁,所以可以用weak

 3:事件会由白色view传递到其子控件self.chatBtn上,所以在self.chatBtn的类里重写hitTest方法,修改返回的view

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容