背景
在我們?nèi)粘I钪兄枇澹琔IButton被用到各種各樣的場景之中禽翼。為了展示出其小巧和美觀往往都把它做的很小也就是給的size很小寂恬。這樣雖然滿足了美觀度,但是造成了點(diǎn)擊體驗效果不好的問題栈妆。(哈哈,因為一般漢子手指太粗點(diǎn)不到按鈕的問題)厢钧。
奮斗的郅博
解決方法
1.給UIButton增加一個擴(kuò)展類(UIButton(Extension))鳞尔,在里面添加如下方法
@implementation UIButton (Extension)
@dynamic hitTestEdgeInsets;
static const NSString *KEY_HIT_TEST_EDGE_INSETS = @"HitTestEdgeInsets";
-(void)setHitTestEdgeInsets:(UIEdgeInsets)hitTestEdgeInsets {
NSValue *value = [NSValue value:&hitTestEdgeInsets withObjCType:@encode(UIEdgeInsets)];
objc_setAssociatedObject(self, &KEY_HIT_TEST_EDGE_INSETS, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(UIEdgeInsets)hitTestEdgeInsets {
NSValue *value = objc_getAssociatedObject(self, &KEY_HIT_TEST_EDGE_INSETS);
if(value) {
UIEdgeInsets edgeInsets; [value getValue:&edgeInsets]; return edgeInsets;
}else {
return UIEdgeInsetsZero;
}
}
- (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.bounds;
CGRect hitFrame = UIEdgeInsetsInsetRect(relativeFrame, self.hitTestEdgeInsets);
return CGRectContainsPoint(hitFrame, point);
}
@end
2.調(diào)用的時候也異常簡單,UIButton對象調(diào)hitTestEdgeInsets方法即可
UIButton *button = [[UIButton alloc] initWithFrame:CGRectZero];
//上下左右的各個方向的Insets量
[button setHitTestEdgeInsets:UIEdgeInsetsMake(-10, -10, -10, -10)];
[self.view addsubview:button];
注:這樣我們點(diǎn)擊UIButton周圍的上下左右各10的位置仍然能觸發(fā)UIButton點(diǎn)擊時間早直。這樣就做好了增加UIButton的點(diǎn)擊范圍寥假。