扩大按钮 btn 响应区域

时间:2023-03-09 19:46:43
扩大按钮 btn 响应区域

方法一:类别

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #c91b13 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; min-height: 21.0px }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #c32275 }
span.s1 { color: #822e0e }
span.s2 { }
span.s3 { color: #c32275 }
span.s4 { color: #703daa }

#import <UIKit/UIKit.h>

#import <objc/runtime.h>

@interface UIButton (EnlargeEdge)

- (void)XSsetEnlargeEdge:(CGFloat) size;

- (void)XSsetEnlargeEdgeWithTop:(CGFloat) top right:(CGFloat) right bottom:(CGFloat) bottom left:(CGFloat) left;

@end

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #c91b13 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; min-height: 21.0px }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #3d1d81 }
p.p5 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #c32275 }
span.s1 { color: #822e0e }
span.s2 { }
span.s3 { color: #c32275 }
span.s4 { color: #703daa }
span.s5 { color: #000000 }
span.s6 { color: #539aa4 }
span.s7 { color: #6122ae }
span.s8 { color: #3d1d81 }
span.s9 { color: #294c50 }

#import "UIButton+EnlargeEdge.h"

@implementation UIButton (EnlargeEdge)

static char topNameKey;

static char rightNameKey;

static char bottomNameKey;

static char leftNameKey;

- (void)XSsetEnlargeEdge:(CGFloat) size

{

objc_setAssociatedObject(self, &topNameKey, [NSNumber numberWithFloat:size], OBJC_ASSOCIATION_COPY_NONATOMIC);

objc_setAssociatedObject(self, &rightNameKey, [NSNumber numberWithFloat:size], OBJC_ASSOCIATION_COPY_NONATOMIC);

objc_setAssociatedObject(self, &bottomNameKey, [NSNumber numberWithFloat:size], OBJC_ASSOCIATION_COPY_NONATOMIC);

objc_setAssociatedObject(self, &leftNameKey, [NSNumber numberWithFloat:size], OBJC_ASSOCIATION_COPY_NONATOMIC);

}

- (void)XSsetEnlargeEdgeWithTop:(CGFloat) top right:(CGFloat) right bottom:(CGFloat) bottom left:(CGFloat) left

{

objc_setAssociatedObject(self, &topNameKey, [NSNumber numberWithFloat:top], OBJC_ASSOCIATION_COPY_NONATOMIC);

objc_setAssociatedObject(self, &rightNameKey, [NSNumber numberWithFloat:right], OBJC_ASSOCIATION_COPY_NONATOMIC);

objc_setAssociatedObject(self, &bottomNameKey, [NSNumber numberWithFloat:bottom], OBJC_ASSOCIATION_COPY_NONATOMIC);

objc_setAssociatedObject(self, &leftNameKey, [NSNumber numberWithFloat:left], OBJC_ASSOCIATION_COPY_NONATOMIC);

}

- (CGRect)enlargedRect

{

NSNumber* topEdge = objc_getAssociatedObject(self, &topNameKey);

NSNumber* rightEdge = objc_getAssociatedObject(self, &rightNameKey);

NSNumber* bottomEdge = objc_getAssociatedObject(self, &bottomNameKey);

NSNumber* leftEdge = objc_getAssociatedObject(self, &leftNameKey);

if (topEdge && rightEdge && bottomEdge && leftEdge)

{

return CGRectMake(self.bounds.origin.x - leftEdge.floatValue,

self.bounds.origin.y - topEdge.floatValue,

self.bounds.size.width + leftEdge.floatValue + rightEdge.floatValue,

self.bounds.size.height + topEdge.floatValue + bottomEdge.floatValue);

}

else

{

return self.bounds;

}

}

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event

{

CGRect rect = [self enlargedRect];

if (CGRectEqualToRect(rect, self.bounds))

{

return [super pointInside:point withEvent:event];

}

return CGRectContainsPoint(rect, point) ? YES : NO;

}

@end

方法二:

第二种:直接创建一个UIButton类,然后复写pointInside方法

使用时继承于此类即可

.h文件

  1. #import <UIKit/UIKit.h>
  2. @interface BiggerClickAreaButton : UIButton
  3. @end

.m文件

  1. #import "BiggerClickAreaButton.h"
  2. @implementation BiggerClickAreaButton
  3. - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event
  4. {
  5. CGRect bounds = self.bounds;
  6. //若原热区小于44x44,则放大热区,否则保持原大小不变
  7. CGFloat widthDelta = MAX(44.0 - bounds.size.width, 0);
  8. CGFloat heightDelta = MAX(44.0 - bounds.size.height, 0);
  9. bounds = CGRectInset(bounds, -0.5 * widthDelta, -0.5 * heightDelta);
  10. return CGRectContainsPoint(bounds, point);
  11. }
  12. @end

使用时直接继承创建即可