美文网首页iOS 知识点
iOS开发增大按钮点击区域

iOS开发增大按钮点击区域

作者: 我是卖报的小行家 | 来源:发表于2020-09-09 18:05 被阅读0次

    这里分两种
    1.button自身frame 以倍数扩大
    2.button自身frame 以上下左右增加边距扩大

    普遍做法, button增加一个分类

    废话不多说直接上代码
    方法一

    #import <UIKit/UIKit.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface UIButton (MGTouchArea)
    @property (nonatomic, copy) NSString *clickArea;
    @end
    
    #import "UIButton+MGTouchArea.h"
    #import <objc/runtime.h>
    @interface UIButton()
    @end
    @implementation UIButton (MGTouchArea)
    //重写
    - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
    {
        [super pointInside:point withEvent:event];
        // 获取bounds 实际大小
        CGRect bounds = self.bounds;
        if (self.clickArea) {
            CGFloat area = [self.clickArea floatValue];
            CGFloat widthDelta = MAX(area * bounds.size.width - bounds.size.width, .0);
            CGFloat heightDelta = MAX(area * bounds.size.height - bounds.size.height, .0);
            //扩大bounds
            bounds = CGRectInset(bounds, -0.5 * widthDelta, -0.5 * heightDelta);
            
        }
        // 点击的点在新的bounds 中 就会返回YES
        return CGRectContainsPoint(bounds, point);
    }
    - (void)setClickArea:(NSString *)clickArea
    {
        objc_setAssociatedObject(self, @selector(clickArea), clickArea, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    - (NSString *)clickArea
    {
        return objc_getAssociatedObject(self, @selector(clickArea));
    }
    @end
    

    用法:

    // 这里就是按钮的实际可点击区域大小,可点击面积等效于按钮的尺寸乘以该参数
        button.clickArea = @"10";
    此处引荐于此篇华文 [https://www.cnblogs.com/CH520/p/12820405.html]
    在此表示感谢
    

    方法二

    #import <UIKit/UIKit.h>
    
    @interface UIButton (EnlargeTouchArea)
    
    //扩大按钮点击范围
    - (void)setEnlargeEdgeWithTop:(CGFloat) top right:(CGFloat) right bottom:(CGFloat) bottom left:(CGFloat) left;
    
    @end
    
    #import "UIButton+EnlargeTouchArea.h"
    #import <objc/runtime.h>
    
    @implementation UIButton (EnlargeTouchArea)
    
    static char topNameKey;
    static char rightNameKey;
    static char bottomNameKey;
    static char leftNameKey;
    
    - (void) setEnlargeEdgeWithTop:(CGFloat) top right:(CGFloat) right bottom:(CGFloat) bottom left:(CGFloat) left
    {
        objc_setAssociatedObject(self, &topNameKey, [NSNumber numberWithFloat:top], OBJC_ASSOCIATION_COPY_NONATOMIC);
        objc_setAssociatedObject(self, &rightNameKey, [NSNumber numberWithFloat:right], OBJC_ASSOCIATION_COPY_NONATOMIC);
        objc_setAssociatedObject(self, &bottomNameKey, [NSNumber numberWithFloat:bottom], OBJC_ASSOCIATION_COPY_NONATOMIC);
        objc_setAssociatedObject(self, &leftNameKey, [NSNumber numberWithFloat:left], OBJC_ASSOCIATION_COPY_NONATOMIC);
    }
    
    - (CGRect) enlargedRect
    {
        NSNumber* topEdge = objc_getAssociatedObject(self, &topNameKey);
        NSNumber* rightEdge = objc_getAssociatedObject(self, &rightNameKey);
        NSNumber* bottomEdge = objc_getAssociatedObject(self, &bottomNameKey);
        NSNumber* leftEdge = objc_getAssociatedObject(self, &leftNameKey);
        if (topEdge && rightEdge && bottomEdge && leftEdge)
        {
            return CGRectMake(self.bounds.origin.x - leftEdge.floatValue,
                              self.bounds.origin.y - topEdge.floatValue,
                              self.bounds.size.width + leftEdge.floatValue + rightEdge.floatValue,
                              self.bounds.size.height + topEdge.floatValue + bottomEdge.floatValue);
        }
        else
        {
            return self.bounds;
        }
    }
    
    - (UIView*) hitTest:(CGPoint) point withEvent:(UIEvent*) event
    {
        CGRect rect = [self enlargedRect];
        if (CGRectEqualToRect(rect, self.bounds))
        {
            return [super hitTest:point withEvent:event];
        }
        return CGRectContainsPoint(rect, point) ? self : nil;
    }
    @end
    

    用法

     [button setEnlargeEdgeWithTop:10 right:500 bottom:10 left:50];
    

    相关文章

      网友评论

        本文标题:iOS开发增大按钮点击区域

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