前言:
我负责努力,其余交给运气。
正文:
开发中,我们的按钮点击热区应不小于44x44pt,否则这个按钮就会让用户觉得“很难用”,点击多次才能点中的赶脚。
一般这种情况,无外乎两种,一种是设计图尺寸给的小、一种是button图片小,所以我们button做的就小。我整理出来了两种解决方案。
1.放大button的热区
继承button,然后重写了按钮中的pointInside方法,使得按钮热区不够44×44大小的先自动缩放到44×44,再判断触摸点是否在新的热区内。方法如下:
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event{
CGRect bounds = self.bounds;
//若原热区小于44x44,则放大热区,否则保持原大小不变
CGFloat widthDelta = MAX(44.0 - bounds.size.width, 0);
CGFloat heightDelta = MAX(44.0 - bounds.size.height, 0);
bounds = CGRectInset(bounds, -0.5 * widthDelta, -0.5 * heightDelta);
return CGRectContainsPoint(bounds, point);
}
2.setImageEdgeInsets
setImageEdgeInsets方法的好处就是不需要重写UIButton,直接在新建的UIButton中改变属性的值就可以达到我们想要的结果。但是个人觉得,这种需求一旦很多的时候,没有重写好用,因为你要在很多地方去写,哪怕项目封装很好,把这个抽出来单独封装,那也需要繁琐的计算上左下右:
[button setImageEdgeInsets:UIEdgeInsetsMake(<#CGFloat top#>, <#CGFloat left#>, <#CGFloat bottom#>, <#CGFloat right#>)];
该方法并没有改变button的热区,button为本身大小,但是它控制了button中的imageView的偏移,可以通过设置上左下右,控制image大小和显示位置。
总结:
不会有最牛逼的解决方式,只会有更适合的解决方式。
题外话:接手了一个项目,项目中导航栏back按钮点击区域太小,我就重写了pointInside。但是,并没有改变热区,后来查找原因的时候发现,setImage改变热区就无效,不setImage的话改变热区就是生效的,为什么这样不得而知,后来换成了setImageEdgeInsets。代码是通过self.navigationItem.leftBarButtonItem添加的返回按钮,如果你们也遇见过此问题并解决了的话,或者知道为什么,希望留个言,求解惑,谢谢。
网友评论