要實現以下圖的密集排列而且相互遮擋的菱形按鈕效果:bash
其UI層級的排列以下:ide
正常狀況下層的按鈕必定會被上層的按鈕遮擋,那麼當點擊按鈕的下半部分,實際上是點擊遮擋它的按鈕的透明區域。函數
這裏解決方案特別簡單,只須要將自定義按鈕,並將須要響應點擊區域計算出來,並重寫響應鏈判斷的方法,讓按鈕只在菱形的點擊範圍內去響應點擊事件:ui
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
UIBezierPath *touchPath = [UIBezierPath bezierPath];
[touchPath moveToPoint:CGPointMake(0, self.frame.size.height * 0.273)];
[touchPath addLineToPoint:CGPointMake(self.frame.size.width * 0.5, self.frame.size.height * 0.545)];
[touchPath addLineToPoint:CGPointMake(self.frame.size.width, self.frame.size.height * 0.273)];
[touchPath addLineToPoint:CGPointMake(self.frame.size.width * 0.5, 0)];
[touchPath closePath];
if ([touchPath containsPoint:point]) {
return YES;
} else {
return NO;
}
}
複製代碼
這裏沒有經過數學函數的座標去計算,太麻煩了,我是經過貝塞爾曲線畫出來了響應的區域,而後經過判斷點擊的位置在不在這個區域來實現。spa