定格 2020-03-28
近日,接到头头突然让我改一个东西,让我马上把某个按钮的点击相应区域扩大一点。作为一个iOS三个月的新人,还真不了解要怎么做。随后,头头说只要加一行代码就行了,然后让某位前辈直接把参考代码发给我。
后来,我加了一行类似于如下的代码:
[button setHitTestEdgeInsets:UIEdgeInsetsMake(-10, -10, -10, -10)];
就使得按钮点击区域扩大了。但是,我不明白其中的原理。于是乎,想要一探究竟。
iOS扩展按钮点击区域
,发现有一个千篇一律的方法:不要重写UIButton类的pointInside:withEvent:方法,使用swizzle交换IMP
+ (void)load { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSError *error = nil; [self jr_swizzleMethod:@selector(pointInside:withEvent:) withMethod:@selector(hitTest_pointInside:withEvent:) error:&error]; NSAssert(!error, @"UIView+HitTest.h swizzling failed: error = %@", error); }); } - (BOOL)hitTest_pointInside:(CGPoint)point withEvent:(UIEvent *)event { if (UIEdgeInsetsEqualToEdgeInsets(self.hitTestEdgeInsets, UIEdgeInsetsZero)) { return [self hitTest_pointInside:point withEvent:event]; } CGRect relativeFrame = self.bounds; CGRect hitFrame = UIEdgeInsetsInsetRect(relativeFrame, self.hitTestEdgeInsets); return CGRectContainsPoint(hitFrame, point); }
pointInside:withEvent:
函数判断,该点击点是否在该view的点击范围内,否则就往时间响应链的下游传递。