iOS UIButton点击响应区域扩大

403 阅读1分钟

有时候按钮设计的太小,点击不太方便,就需要扩大UIButton的点击区域。如何优雅地解决这个问题呢? 1、给UIButton类添加Category分类

#import "UIButton+HitTestEdgeInsets.h"

2、使用runtime给UIButton添加一个新属性hitTestEdgeInsets,数据类型为UIEdgeInsets。UIEdgeInsets有四个参数,分别是top, left, bottom, right。

定义一个常量存储key

 static NSString const *KEY_HIT_TEST_EDGE_INSETS = @"HitTestEdgeInsets";

setter方法:

     - (void)setHitTestEdgeInsets:(UIEdgeInsets)lm_hitTestEdgeInsets {
    NSValue *value = [NSValue value:&hitTestEdgeInsets withObjCType:@encode(UIEdgeInsets)];
    objc_setAssociatedObject(self, &KEY_HIT_TEST_EDGE_INSETS, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

getter方法:

- (UIEdgeInsets)hitTestEdgeInsets {
    NSValue *value = objc_getAssociatedObject(self, &KEY_HIT_TEST_EDGE_INSETS);
    if (value) {
        UIEdgeInsets edgeInsets;
        [value getValue:&edgeInsets];
        return edgeInsets;
    } else {
        return UIEdgeInsetsZero;
    }
}

3、重写 UIView 的pointInside:withEvent:方法,修改 bounds 属性

 - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
 if(UIEdgeInsetsEqualToEdgeInsets(self.hitTestEdgeInsets, UIEdgeInsetsZero) || !self.enabled || self.hidden) {
     return [super pointInside:point withEvent:event];
 }
 CGRect relativeFrame = self.c;
 CGRect expandFrame = UIEdgeInsetsInsetRect(relativeFrame, self.hitTestEdgeInsets);
 return CGRectContainsPoint(expandFrame, point);
 }

4、使用时直接给UIButton新属性

Button.hitTestEdgeInsets = UIEdgeInsetsMake(-10, -10, -10, -10);