美文网首页零碎知识点程序员iOS
ios 两种方式扩大button点击范围

ios 两种方式扩大button点击范围

作者: 雪_晟 | 来源:发表于2017-01-09 12:21 被阅读587次

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

    相关文章

      网友评论

      • 34码的小孩子:方法二超出一定范围even确实没有传递过去。方法一能正常。其实不用继承,用Category就可以了。
        雪_晟:@自负的大撸sir https://www.jianshu.com/p/8d1ac878f08e
        雪_晟:@自负的大撸sir 另一篇文章有
        自负的大撸sir:求教分类咋写?
      • cb3fc6332154:先感谢一下作者的分享,另外方法二不可取!
        具体你可以直接return self试一下,你点击的范围超过一定值,即使hitTest返回self,button也不会响应事件,我想应该是和event中的touch对象有关,正确的方法还是应该使用方案一,重写pointInside;
        雪_晟:@34码的小孩子 等闲了测测
        34码的小孩子:hitTest超出一定范围,没有将even传递给Button, 知道是什么原因了么?
        雪_晟:@弗丁老爹 当时测的没有问题,我平常用的也是第一种,我后面再看看,谢谢!
      • 751fc49dcbfd:有git demo?
        雪_晟:新建个button 感受下 就知道了

      本文标题:ios 两种方式扩大button点击范围

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