UIView与切出段和阴影

问题描述:

我的问题是:我试图切出自定义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

但我确实需要实现第一个图像显示的结果。 我正在考虑逐行建立路径,但当涉及到这个弧时会出现问题,并且结果可能不会那么准确。

有没有人有想法如何可以做? 谢谢!

编辑: 如果问题是路径错误,请不要在代码中使用圆圈和猜测坐标来合成路径。相反,您应该导出坐标实际图稿并使用曲线的图稿坐标。它看起来像你有一个草图文件,所以最简单的方法是复制并粘贴到paint code,它会给你曲线的代码,但如果你没有绘制代码​​(你应该,它的惊人的这种东西),您可以将草图中的曲线导出为SVG。如果您在文本编辑器中打开SVG,您将看到其中的可读XML文件,您可以从那里从Bezier曲线中提取控制点。

+0

这就是我实际做的。我创建了两层 - 阴影和遮罩层。我将阴影图层添加为自定义视图的子图层。我创建了一个新视图并将其设置为遮罩层。它会产生这种奇怪的效果。 – Syngmaster

+0

查看编辑答案。 –

+0

谢谢! PaintCode是一个了不起的工具!它完成了它的工作,现在一切都运行得很完美!唯一的问题是需要调整所有曲线点以在不同的设备尺寸上产生相同的效果。我应该能够管理:) – Syngmaster