背景
在开发中我们经常会遇到这种情况,UI给了我们一个比较小的按钮图标,我们如果设置按钮的大小和图标一样那么点击区域也就会比较小,用户体验并不好。
我之前的做法
为了扩大按钮的点击区域,我会在设置按钮的大小时将其变大,并根据变大后的按钮去设置它的位置,让其和效果图上的位置大概差不多。 这样做会有一个问题:我需要去算一下这个按钮该放在什么位置上,这样就多了一个心算的步骤,浪费了一些时间。
看到别人的一种做法
并没有改变按钮的大小,只是改变了按钮的热区(可点击区域)。
他的做法是创建了一个新的按钮,然后在创建按钮的时候都继承自此按钮。个人觉得这样做不是很灵活,于是受启发为按钮写了一个分类。并将热区扩大的比例作为按钮的一个属性。
按钮分类代码
.h
#import <UIKit/UIKit.h>
@interface UIButton (changeEffectiveArea)
// 扩大按钮热区的比例系数(曲线救国)
@property (nonatomic, copy) NSString * clickArea;
@end
/*******************************************************************/
.m
#import "UIButton+changeEffectiveArea.h"
#import <objc/runtime.h>
@implementation UIButton (changeEffectiveArea)
- (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
效果图

demo地址 ***https://gitee.com/liangsenliangsen/expand_button_click_area
****本篇文章到这里就结束了,愿大家加班不多工资多,男同胞都有女朋友,女同胞都有男朋友。😊***
网友评论