美文网首页
#06-hitTest方法练习2#

#06-hitTest方法练习2#

作者: 冷洪林 | 来源:发表于2016-09-06 23:27 被阅读15次

    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];
            }
        }
    

    相关文章

      网友评论

          本文标题:#06-hitTest方法练习2#

          本文链接:https://www.haomeiwen.com/subject/cjqjettx.html