有时候按钮设计的太小,点击不太方便,就需要扩大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);