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

  • 相关阅读:
    【转载】 NumPy之:数据类型对象dtype
    在深度学习的视觉VISION领域数据预处理的魔法常数magic constant、黄金数值的复现: mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225]
    关于Numpy数据类型对象(dtype)使用详解
    【转载】 大端模式和小端模式的区别是什么?
    在使用pytorch官方给出的torchvision中的预训练模型参数时为保证收敛性要求使用原始的数据预处理方式
    【转载】 解决 sudo echo x > 时的 Permission denied错误
    Javascript高级程序设计第二版前三章基本数据等笔记
    冒号课堂§3.4:事件驱动
    理解 JavaScript 闭包
    Browser clientX scrollLeft clientLeft
  • 原文地址:https://www.cnblogs.com/xufengyuan/p/6980467.html
Copyright © 2020-2023  润新知