看上圖,代碼很簡(jiǎn)單在藍(lán)色視圖是內(nèi)容view徙邻,在內(nèi)容view上有一個(gè)button就是紅色的方框,這個(gè)button寬高是15x15畸裳。
經(jīng)常遇到這樣的需求缰犁,UI設(shè)計(jì)的按鈕樣式很小,但是要求擴(kuò)大點(diǎn)擊范圍怖糊。最先想到一種辦法是帅容,底部放圖片,上面放一個(gè)透明的button伍伤,這種方式可以實(shí)現(xiàn)并徘,但是隨著業(yè)務(wù)增加,代碼不緊難看扰魂,還很冗余麦乞。
第二種方式:
- (nullableUIView*)hitTest:(CGPoint)point withEvent:(nullableUIEvent*)event; 這個(gè)方法
簡(jiǎn)單說這個(gè)方法就是會(huì)遍利所有子視圖蕴茴,通過pointInside:withEvent:這個(gè)方法判斷點(diǎn)擊的點(diǎn)是否在響應(yīng)視圖內(nèi),找到指定點(diǎn)最前面的視圖也就是最上層的視圖姐直,然后返回倦淀。
我們加上這么一段代碼:
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event {
? ? CGRect newRect =CGRectInset(self.actionButton.frame, -20, -20);
? ? if(CGRectContainsPoint(newRect, point) && !self.actionButton.hidden&&self.actionButton.alpha>0.01) {
? ? ? ? return self.actionButton;
? ? }
?? return [superhitTest:pointwithEvent:event];
}
? 我們通? CGRect newRect =CGRectInset(self.actionButton.frame, -20, -20);這個(gè)方法來擴(kuò)大button的frame声畏。注意:dx撞叽、dy是負(fù)值是擴(kuò)大,正值是縮小,如果我的x插龄、y都以0為起點(diǎn) dx愿棋、dy縮小的情況下,在Autolayout用這個(gè)方法后x辫狼、y的值可能不會(huì)出來初斑,frame 部局下會(huì)正常。例如說我的button的frame是(origin = (x = 42.666666666666657, y = 42.666666666666686), size = (width = 15, height = 15))膨处,擴(kuò)大后位置和大小是(origin = (x = 22.666666666666657, y = 22.666666666666686), size = (width = 55, height = 55)),x作標(biāo)與y作標(biāo)分別減20砂竖,55這個(gè)值是怎么來的呢真椿?20x2+15 = 55是這么來的。然后后判斷CGRectContainsPoint(newRect, point) 點(diǎn)是否在新作標(biāo)內(nèi)乎澄,再加上后面的常規(guī)判斷突硝。這樣就可以了!
第三種方式:
由于調(diào)用了init方法所以會(huì)走系統(tǒng)layoutSubViews方法置济,這個(gè)方法會(huì)計(jì)算出按鈕的實(shí)際坐標(biāo)解恰,利用這一點(diǎn)新生成一個(gè)frame
- (void)layoutSubviews {
? ? [super layoutSubviews];
? ? self.actionRect = CGRectMake(self.actionButton.frame.origin.x - 20, self.actionButton.frame.origin.y - 20, CGRectGetWidth(self.actionButton.frame)+ 20, CGRectGetHeight(self.actionButton.frame) + 20);
}
然后和上面的代碼一樣,上述兩種方式都可以實(shí)現(xiàn)浙于。推薦用第二種护盈,因?yàn)椴挥寐暶餍碌淖兞浚賹懸粋€(gè)方法羞酗,最重要的是layoutSubviews會(huì)增加CPU的負(fù)擔(dān)腐宋。
最后附上Demo