2012-07-18 45 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