那么如何自定義按鈕點擊的有效區域呢,其實很簡單,只要重寫一個函數即可:
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
系統發生觸摸事件的時候會從window到父控件到子控件一個個檢測觸摸點是否在其中,如果在其中,則返回YES,最后返回YES的子控件作為響應事件的控件。
我們只要重寫這個方法,在其中判斷,是否點擊了我們想要的區域,是的話就返回YES,否則返回NO,這樣就實現了自定義點擊的有效區域了。注意,這邊並沒有改變按鈕的形狀,按鈕還是矩形的按鈕,只是改變了按鈕中響應區域而已。
那么接下來的問題就是,怎么判斷一個點是否在一個不是矩形的區域中呢,這邊可以使用UIBezierPath的方法:
- (BOOL)containsPoint:(CGPoint)point;
我們可以先根據想要的形狀繪制一條path,然后判斷調用上面的方法去判斷即可。
例如一個正方形的按鈕,怎么才能讓他在它圓形的范圍點擊才有反應,其他的地方沒有反應呢?
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { //首先調用父類的方法確定點擊的區域確實在按鈕的區域中 BOOL res = [super pointInside:point withEvent:event]; if (res) { //繪制一個圓形path UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:self.bounds]; if ([path containsPoint:point]) { //如果在path區域內,返回YES returnYES; } returnNO; } returnNO; }
這樣,點擊按鈕圓形的部分才會有效果,其他地方沒有反應。