美文网首页iOS大咖说
iOS开发中扩大按钮的点击区域

iOS开发中扩大按钮的点击区域

作者: 梁森的简书 | 来源:发表于2018-09-03 16:24 被阅读135次

背景

在开发中我们经常会遇到这种情况,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

效果图

0.0点击区域.gif

demo地址 ***https://gitee.com/liangsenliangsen/expand_button_click_area

****本篇文章到这里就结束了,愿大家加班不多工资多,男同胞都有女朋友,女同胞都有男朋友。😊***

相关文章

网友评论

    本文标题:iOS开发中扩大按钮的点击区域

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