- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
? ? UIView *view = [super hitTest:point withEvent:event];
? ? if (view == nil) {
? ? ? ? // 轉(zhuǎn)換坐標(biāo)系
? ? ? ? CGPoint newPoint = [self.hitButton convertPoint:point fromView:self];
? ? ? ? // 判斷觸摸點(diǎn)是否在button上
? ? ? ? if (CGRectContainsPoint(self.hitButton.bounds, newPoint)) {
? ? ? ? ? ? view = self.hitButton;//hitButton就是我們想點(diǎn)擊的控件啊奄,讓這個(gè)控件作為可點(diǎn)擊的view返回微服。
? ? ? ? }
? ? }
? ? return view;
}
首先我們要明白一個(gè)道理踏烙,為什么一個(gè)視圖超過了父視圖的范圍的部分被點(diǎn)擊的時(shí)候沒有響應(yīng)呢泪酱,這是iOS事件響應(yīng)鏈造成的蝎困。因?yàn)楫?dāng)一個(gè)視圖被點(diǎn)擊的時(shí)候护昧,系統(tǒng)要去尋找是哪個(gè)視圖被點(diǎn)擊了莫其,就會從父視圖開始去查找子視圖癞尚,如果點(diǎn)擊事件也在子視圖范圍內(nèi)就會去查子視圖的子視圖,直到這個(gè)子視圖沒有子視圖乱陡,或者點(diǎn)擊事件不在子視圖范圍內(nèi)了否纬,就把把這個(gè)視圖作為第一響應(yīng)者。
所以我們點(diǎn)擊一塊位于父視圖外的區(qū)域蛋褥,那它本來就不在父視圖范圍里临燃,那也就不會去檢查父視圖的子視圖了,也就不會把這個(gè)子視圖作為事件的響應(yīng)者。
所以我們想要讓這塊位于父視圖外面的區(qū)域被點(diǎn)擊時(shí)也能響應(yīng)膜廊,就需要修改父視圖的點(diǎn)擊范圍乏沸,重寫- (UIView )hitTest:(CGPoint)point withEvent:(UIEvent )event;方法。