iOS之Button点击范围以及热区的放大

前言:

我负责努力,其余交给运气。

正文:

开发中,我们的按钮点击热区应不小于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大小和显示位置。

3. hitTest
经由小伙伴提示,发现也可以用hitTest实现类似效果。hitTest如果实现放大效果的话,其实代码、逻辑和pointInside都是是十分相似的:pointInside是我们放大了bounds然后判断触点是不是再其中,通过BOOL值控制是否响应事件;hitTest也是改变bounds然后判断触点是不是再其中,最后是找到一个最适合的view来响应事件;

但是其实,重点是,我发现hitTest其实牛逼之处不在这。所以我决定单独整理一篇有关hitTest的文章,嘿嘿,大家有兴趣的可以看一下哈。

总结:

不会有最牛逼的解决方式,只会有更适合的解决方式。

参考文章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容