2012-07-18 72 views
3

我有一个自定义按钮(它使用一个圆圈形状的图像作为它的自定义视图)。问题是:自定义按钮的活动区域太大,如果我在按钮外点击至少100个像素,它仍然会被注册为按钮上的一个点击。这导致意外敲击。更小的活动区域为圆形自定义按钮

注意: - 我不想减小按钮的尺寸,因为它已经比最低要求大了。我想减少可点击空间。

如何减少这些按钮上的活动区域?

回答

2

如果你的按钮还不是UIButton的子类,它必须要做到这一点。您可以覆盖pointInside:withEvent:以将“可触摸”区域更改为任何您想要的任意形状。这只是改变了命中框的插图一个子类,可能是这个样子:

// --HEADER-- 
@interface TouchInsetButton : UIButton 
@property (nonatomic, assign) UIEdgeInsets touchInsets; 
@end 

// --IMPLEMENTATION-- 
@implementation TouchInsetButton 
@synthesize touchInsets = _touchInsets; 

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    CGRect modifiedHitBox = UIEdgeInsetsInsetRect([self bounds], _touchInsets); 
    return CGRectContainsPoint(modifiedHitBox, point); 
} 

@end 

不过请注意,当你注意到了,UIButtons通常使用边框,这比他们的范围稍大。只要使用这个子类而不设置任何插入,将会产生一个只接受完全在按钮边界内的点击的按钮。

+0

覆盖'pointInside'是正确的。由于OP的按钮是循环的,因此它需要一些Pythagoras,而不仅仅是'CGRectContainsPoint'。对于非常复杂的形状,可以按照按钮轮廓的形状构造一个'UIBezerPath',并在其上调用'containsPoint'。 – Dondragmer 2012-07-19 06:33:01

+0

这对我不起作用。如果我通过使用负的插入值放大按钮周围的可触摸区域,则该按钮不会识别插入区域外边缘附近的轻叩。 pointInside:withEvent方法返回YES,并且我可以看到点击时按钮图像闪烁,但该按钮的目标选择器从不被调用。但是,如果我将控件事件更改为UIControlEventTouchDown,那么一切都按预期工作。 – dmarnel 2013-01-29 22:50:30