前言:
我負(fù)責(zé)努力垛叨,其余交給運氣伦糯。
正文:
開發(fā)中,我們的按鈕點擊熱區(qū)應(yīng)不小于44x44pt嗽元,否則這個按鈕就會讓用戶覺得“很難用”敛纲,點擊多次才能點中的趕腳。
一般這種情況剂癌,無外乎兩種淤翔,一種是設(shè)計圖尺寸給的小、一種是button圖片小佩谷,所以我們button做的就小旁壮。我整理出來了兩種解決方案。
1.放大button的熱區(qū)
繼承button谐檀,然后重寫了按鈕中的pointInside方法抡谐,使得按鈕熱區(qū)不夠44×44大小的先自動縮放到44×44,再判斷觸摸點是否在新的熱區(qū)內(nèi)桐猬。方法如下:
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event{
CGRect bounds = self.bounds;
//若原熱區(qū)小于44x44麦撵,則放大熱區(qū),否則保持原大小不變
CGFloat widthDelta = MAX(44.0 - bounds.size.width, 0);
CGFloat heightDelta = MAX(44.0 - bounds.size.height, 0);
bounds = CGRectInset(bounds, -0.5 * widthDelta, -0.5 * heightDelta);
return CGRectContainsPoint(bounds, point);
}
2.setImageEdgeInsets
setImageEdgeInsets方法的好處就是不需要重寫UIButton溃肪,直接在新建的UIButton中改變屬性的值就可以達(dá)到我們想要的結(jié)果免胃。但是個人覺得,這種需求一旦很多的時候惫撰,沒有重寫好用羔沙,因為你要在很多地方去寫,哪怕項目封裝很好润绎,把這個抽出來單獨封裝,那也需要繁瑣的計算上左下右:
[button setImageEdgeInsets:UIEdgeInsetsMake(<#CGFloat top#>, <#CGFloat left#>, <#CGFloat bottom#>, <#CGFloat right#>)];
該方法并沒有改變button的熱區(qū),button為本身大小莉撇,但是它控制了button中的imageView的偏移呢蛤,可以通過設(shè)置上左下右,控制image大小和顯示位置棍郎。
3. hitTest
經(jīng)由小伙伴提示其障,發(fā)現(xiàn)也可以用hitTest
實現(xiàn)類似效果。hitTest
如果實現(xiàn)放大效果的話涂佃,其實代碼励翼、邏輯和pointInside
都是是十分相似的:pointInside
是我們放大了bounds
然后判斷觸點是不是再其中,通過BOOL
值控制是否響應(yīng)事件辜荠;hitTest
也是改變bounds
然后判斷觸點是不是再其中汽抚,最后是找到一個最適合的view
來響應(yīng)事件;
但是其實伯病,重點是造烁,我發(fā)現(xiàn)hitTest
其實牛逼之處不在這。所以我決定單獨整理一篇有關(guān)hitTest的文章午笛,嘿嘿惭蟋,大家有興趣的可以看一下哈。
總結(jié):
不會有最牛逼的解決方式药磺,只會有更適合的解決方式告组。