UI给的图有时候很小,或者有个需求需要我们扩大button的点击区域, 我们一般的操作是在button 上添加一个view 增加点击事件,但是我们还有其他更方便的方法去扩大button 的点击区域。有需要可以了解下事件的分发机制。
有两种方式扩大button 的点击区域:
第一种:重写方法 -(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event
继承与UIButton,实现如下效果:
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event
{
CGRect bounds = self.bounds;
//扩大原热区直径至26,可以暴露个接口,用来设置需要扩大的半径。
CGFloat widthDelta = MAX(26, 0);
CGFloat heightDelta = MAX(26, 0);
bounds = CGRectInset(bounds, -0.5 * widthDelta, -0.5 * heightDelta);
return CGRectContainsPoint(bounds, point);
}
第二种: 重写方法 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
CGRect rectBig = CGRectInset(self.bounds, -(27.0/2), -(27.0/2));
if (CGRectContainsPoint(rectBig, point)) {
return self;
}else{
return nil;
}
return self;
}
其实我们上面所做的变化其实如果仔细看点击区域还是个矩形,如果需要我们将点击区域规定在圆形范围 内,我们可以这样做:
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
[super hitTest:point withEvent:event];
CGPoint center = CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2);
//当然这个半径也可以扩大
CGFloat raidus = self.frame.size.height >= self.frame.size.width ?self.frame.size.width/2 :self.frame.size.width/2;
//传入中心点 实时点击点 与半径判断 点击点是否在半径区域内
BOOL pointInRound =[self touchPointInsideCircle:center radius:raidus targetPoint:point];
if (pointInRound) {
return self;
}else
{
return nil;
}
}
//用来判断 圆形点击区域
- (BOOL)touchPointInsideCircle:(CGPoint)center radius:(CGFloat)radius targetPoint:(CGPoint)point
{
CGFloat dist = sqrtf((point.x - center.x) * (point.x - center.x) +
(point.y - center.y) * (point.y - center.y));
return (dist <= radius);
}
网友评论
具体你可以直接return self试一下,你点击的范围超过一定值,即使hitTest返回self,button也不会响应事件,我想应该是和event中的touch对象有关,正确的方法还是应该使用方案一,重写pointInside;