#06-hitTest方法练习2#

06-hitTest方法练习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:withEvent:调用过程 iOS系统检测到手指触摸(Touch)操作时会将其放入当前活动A...
    随风飘荡的小逗逼阅读 2,354评论 0 3
  • 一、事件传递 1、事件传递 验证一下是不是这个流程! 1、建立一个工程!搭建如下界面。图片 在修改View背景 2...
    Codepgq阅读 710评论 0 5
  • 一篇搞定事件传递、响应者链条、hitTest和pointInside的使用发生触摸事件后,系统会将该事件加入到一个...
    克鲁德李阅读 1,160评论 0 1
  • 时光偷走了 眼前的珍贵 记忆的苦涩 逝去的东西 最好不念 也不再见 终点与尽头 烟火与红尘 浅浅遇 流年与沧桑 淡...
    曹文明阅读 300评论 0 2
  • 说好我带加加到成都来和涛子汇合的,突然的交通事故让涛子寸步难行,只好把加加送去奶奶家请奶奶帮忙带。 可王叔这一早起...
    roserao阅读 162评论 0 0