圆形自定义按钮的活动区域较小

Posted

技术标签:

【中文标题】圆形自定义按钮的活动区域较小【英文标题】:Smaller active area for circle shaped Custom button 【发布时间】:2012-07-18 16:05:28 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

如果您的按钮还不是 UIButton 的子类,那么它必须是实现这一点。您可以覆盖pointInside:withEvent: 以将“可触摸”区域更改为您想要的任意形状。一个简单地改变 hit box 插入的子类可能看起来像这样:

// --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

请注意,正如您所注意到的,UIButton 通常使用比其边界稍大的边界框。仅使用此子类而不设置任何插入将导致按钮仅接受完全在按钮范围内的点击。

【讨论】:

覆盖pointInside 是正确的。由于 OP 的按钮是圆形的,它需要一些毕达哥拉斯,而不仅仅是CGRectContainsPoint。对于非常复杂的形状,在按钮轮廓的形状中构造一个UIBezerPath,然后调用containsPoint 这对我不起作用。如果我使用负插入值放大按钮周围的可触摸区域,则按钮无法识别插入区域外边缘附近的点击。 pointInside:withEvent 方法返回 YES,点击时我可以看到按钮图像闪烁,但从未调用按钮的目标选择器。但是,如果我将控制事件更改为 UIControlEventTouchDown,那么一切都会按预期进行。

以上是关于圆形自定义按钮的活动区域较小的主要内容,如果未能解决你的问题,请参考以下文章

WinForm(C#)自定义控件之——RoundButton(圆形按钮)

SignIn with Apple 的自定义圆形按钮

使标签栏上的自定义按钮圆形

IOS自定义UIbutton,怎样让点击的有效区域集中在图标内?

请问,百度地图如何返回圆形覆盖物范围内自定义的标注?

“导航项中不支持普通样式”警告我的自定义条形按钮项