zoukankan      html  css  js  c++  java
  • ios 两种方式扩大button点击范围

    https://www.jianshu.com/p/06452c29a893

    UI给的图有时候很小,或者有个需求需要我们扩大button的点击区域, 我们一般的操作是在button 上添加一个view 增加点击事件,但是我们还有其他更方便的方法去扩大button 的点击区域。有需要可以了解下事件的分发机制。
    有两种方式扩大button 的点击区域:

    第一种:重写方法 -(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event

    继承与UIButton,实现如下效果:

    -(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event
    {
        CGRect bounds = self.bounds;
        //扩大原热区直径至26,可以暴露个接口,用来设置需要扩大的半径。
        CGFloat widthDelta = MAX(26, 0);
        CGFloat heightDelta = MAX(26, 0);
        bounds = CGRectInset(bounds, -0.5 * widthDelta, -0.5 * heightDelta);
        return CGRectContainsPoint(bounds, point);
    }
    

    第二种: 重写方法 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event

    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
    {
        CGRect rectBig = CGRectInset(self.bounds, -(27.0/2), -(27.0/2));
        
        if (CGRectContainsPoint(rectBig, point)) {
            return self;
        }else{
            return nil;
        }
        
        return self;
    }
    
    其实我们上面所做的变化其实如果仔细看点击区域还是个矩形,如果需要我们将点击区域规定在圆形范围 内,我们可以这样做:
    -(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
        [super hitTest:point withEvent:event];
        
        CGPoint center = CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2);
        
        
       //当然这个半径也可以扩大
        CGFloat raidus = self.frame.size.height >= self.frame.size.width ?self.frame.size.width/2 :self.frame.size.width/2;
        
       //传入中心点 实时点击点 与半径判断 点击点是否在半径区域内
        BOOL pointInRound =[self touchPointInsideCircle:center radius:raidus targetPoint:point];
        
        if (pointInRound) {
            return self;
        }else
        {
            return nil;
        }
    }
    
    //用来判断 圆形点击区域
    - (BOOL)touchPointInsideCircle:(CGPoint)center radius:(CGFloat)radius targetPoint:(CGPoint)point
    {
        CGFloat dist = sqrtf((point.x - center.x) * (point.x - center.x) +
                             (point.y - center.y) * (point.y - center.y));
        return (dist <= radius);
    }


    作者:雪_晟
    链接:https://www.jianshu.com/p/06452c29a893
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    条件
    循环
    列表
    字典
    集合
    公共操作
    函数-2
    函数-1
    函数加强
    文件操作
  • 原文地址:https://www.cnblogs.com/itlover2013/p/15174495.html
Copyright © 2011-2022 走看看