美文网首页iOS随笔
iOS之Button点击范围以及热区的放大

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

作者: 陌路卖酱油 | 来源:发表于2019-06-11 17:51 被阅读3次

前言:

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

正文:

开发中,我们的按钮点击热区应不小于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添加的返回按钮,如果你们也遇见过此问题并解决了的话,或者知道为什么,希望留个言,求解惑,谢谢。

参考文章

相关文章

网友评论

    本文标题:iOS之Button点击范围以及热区的放大

    本文链接:https://www.haomeiwen.com/subject/jrccfctx.html