2017-11-25 183 views
0

我的問題是:我試圖切出自定義UIView段並將陰影效果應用於此視圖。UIView與切出段和陰影

在自定義UIView類,我這樣做:

創建兩層 - 陰影和麪具。添加一個陰影圖層作爲此自定義視圖的子圖層。然後,我創建了一個新視圖,將其蒙版設置爲蒙版圖層,並將其作爲子視圖添加到自定義視圖中。

self.backgroundColor = [UIColor clearColor]; 
CGFloat radius = 40; 
float startAngle = -M_PI; 
float endAngle = 0; 

UIBezierPath *path = [UIBezierPath bezierPathWithRect:self.bounds]; 

[path moveToPoint:CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMaxY(self.bounds)+radius/1.8)]; 
[path addArcWithCenter:CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMaxY(self.bounds)+radius/1.8) radius:radius startAngle:startAngle endAngle:endAngle clockwise:YES]; 

CAShapeLayer *shadowLayer = [[CAShapeLayer alloc] init]; 
shadowLayer.frame = self.bounds; 
shadowLayer.path = path.CGPath; 
shadowLayer.shadowColor = [UIColor grayColor].CGColor; 
shadowLayer.shadowOpacity = 0.5; 
shadowLayer.shadowRadius = 2; 
shadowLayer.masksToBounds = NO; 
shadowLayer.shadowOffset = CGSizeMake(2.0, 2.0); 
shadowLayer.fillRule = kCAFillRuleEvenOdd; 


CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init]; 
maskLayer.frame = self.bounds; 
maskLayer.masksToBounds = NO; 
maskLayer.path = path.CGPath; 
maskLayer.fillRule = kCAFillRuleEvenOdd; 
maskLayer.fillColor = [UIColor whiteColor].CGColor; 

[self.layer addSublayer:shadowLayer]; 

UIView *view = [[UIView alloc] initWithFrame:self.bounds]; 
view.backgroundColor = [UIColor whiteColor]; 
view.layer.mask = maskLayer; 
[self addSubview:view]; 

這就是我想達到什麼 -

enter image description here

,這是我真正得到

enter image description here

如果我設置clipToBounds = YES,將削減關閉所需的陰影效果。

如果我想切割半圓,絕對沒有問題。因爲在這種情況下,半圓形路徑完全位於視圖邊界內。

enter image description here

但我確實需要實現第一個圖像顯示的結果。 我正在考慮逐行建立路徑,但當涉及到這個弧時會出現問題,並且結果可能不會那麼準確。

有沒有人有想法如何可以做? 謝謝!

回答

1

編輯: 如果問題是路徑錯誤,請不要在代碼中使用圓圈和猜測座標來合成路徑。相反,您應該導出座標實際圖稿並使用曲線的圖稿座標。它看起來像你有一個草圖文件,所以最簡單的方法是複製並粘貼到paint code,它會給你曲線的代碼,但如果你沒有繪製代碼​​(你應該,它的驚人的這種東西),您可以將草圖中的曲線導出爲SVG。如果您在文本編輯器中打開SVG,您將看到其中的可讀XML文件,您可以從那裏從Bezier曲線中提取控制點。

+0

這就是我實際做的。我創建了兩層 - 陰影和遮罩層。我將陰影圖層添加爲自定義視圖的子圖層。我創建了一個新視圖並將其設置爲遮罩層。它會產生這種奇怪的效果。 – Syngmaster

+0

查看編輯答案。 –

+0

謝謝! PaintCode是一個了不起的工具!它完成了它的工作,現在一切都運行得很完美!唯一的問題是需要調整所有曲線點以在不同的設備尺寸上產生相同的效果。我應該能夠管理:) – Syngmaster