在開發(fā)中福侈,我們可能會(huì)遇到這樣兩種場(chǎng)景。一種的按鈕frame太小要擴(kuò)大它的點(diǎn)擊范圍;另一種是按鈕的顯示超出的superview的范圍超出部分無法點(diǎn)擊。
根據(jù)之前一篇文章觸摸事件流程的分析括尸,我們知道了主要是在尋找view(pointInside:withEvent:
和hitTest:withEvent:
)時(shí),沒有找到Button導(dǎo)致的病毡,按照這個(gè)思路就能找到解決方法濒翻。
1.擴(kuò)大Button點(diǎn)擊范圍
只要在button判斷是否點(diǎn)擊到自身的pointInside:withEvent:
方法中寫上自己的判斷邏輯返回
//按鈕點(diǎn)擊范圍上左下右各增加25
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
CGRect frame = self.bounds;
frame.origin.x -= 25;
frame.origin.y -= 25;
frame.size.width += 50;
frame.size.height += 50;
if (CGRectContainsPoint(frame, point)) {
return true;
}
return [super pointInside:point withEvent:event];
}
2.Button超出superview部分點(diǎn)擊有效
這個(gè)主要是在點(diǎn)擊后判斷到button的superview沒有點(diǎn)擊到,那么就要重寫button的superview的pointInside:withEvent:
方法
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
if (self.subviews.count > 0) {
UIView *buttonView = [self.subviews firstObject];
if (CGRectContainsPoint(buttonView.frame, point)) {
return true;
}
}
return [super pointInside:point withEvent:event];
}
這里因?yàn)槲以趘iew上就放了一個(gè)button啦膜,所以直接取了第一個(gè)有送,具體獲取的方法可以根據(jù)頁面情況獲取。
最后時(shí)測(cè)試代碼IOSStudyTest