使用Bezier Path作为剪贴蒙版

时间:2013-12-05 20:35:23

标签: ios objective-c animation clipping

我想知道是否可以将视图剪辑为Bezier路径。我的意思是我希望能够仅在封闭的贝塞尔路径内的区域中看到视图。原因是我有一个不规则形状的轮廓,我想逐渐用从上到下的纯色填充形状。如果我能够使某个视图仅在路径中可见,那么我可以简单地创建一个我想要的颜色的UIView,然后根据需要更改其框架的y坐标,有效地填充形状。如果有人对如何实现这一点有任何更好的想法,将不胜感激。对于记录,形状的填充将与用户手指的y值匹配,因此它不能是连续动画。感谢。

更新(很长一段时间后):

我尝试了你的答案,Rob,除了一件事,它的效果很好。我的目的是在掩模保持在屏幕上的相同位置时移动视图被遮罩。这样我就能给人一种面具被填满的印象"由观点。问题在于,根据你的答案编写的代码,当我移动视图时,掩码随之移动。我明白这是可以预料到的,因为我所做的只是将它添加为视图的掩码,所以如果它与动作相关联的东西它将会移动,这是合理的。我尝试添加掩码作为superview的子层,以便它保持放置,但这有非常奇怪的结果。这是我的代码:

self.test = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
self.test.backgroundColor = [UIColor greenColor];

[self.view addSubview:self.test];

UIBezierPath *myClippingPath = [UIBezierPath bezierPath];
[myClippingPath moveToPoint:CGPointMake(100, 100)];
[myClippingPath addCurveToPoint:CGPointMake(200, 200) controlPoint1:CGPointMake(self.screenWidth, 0) controlPoint2:CGPointMake(self.screenWidth, 50)];
[myClippingPath closePath];


CAShapeLayer *mask = [CAShapeLayer layer];
mask.path = myClippingPath.CGPath;

self.test.layer.mask = mask;

CGRect firstFrame = self.test.frame;
firstFrame.origin.x += 100;
[UIView animateWithDuration:3 animations:^{
    self.test.frame = firstFrame;
}];

感谢您的帮助。

2 个答案:

答案 0 :(得分:56)

您可以通过将视图的图层蒙版设置为CAShapeLayer来轻松完成此操作。

UIBezierPath *myClippingPath = ...

CAShapeLayer *mask = [CAShapeLayer layer];
mask.path = myClippingPath.CGPath;

myView.layer.mask = mask;

如果您尚未将QuartzCore框架添加到目标中,则需要添加。


在斯威夫特......

let yourCarefullyDrawnPath = UIBezierPath( .. blah blah
let maskForYourPath = CAShapeLayer()
maskForYourPath.path = carefullyRoundedBox.CGPath
layer.mask = maskForYourPath

答案 1 :(得分:3)

只是Rob解决方案的一个例子,有一个UIWebView作为UIView子视图,名为smoothViewsmoothView使用bezierPathWithRoundedRect制作圆角灰色背景(右侧通知)。这很好。

但如果smoothView只有普通的剪辑子视图,那么你就明白了:

enter image description here

如果您执行Rob所说的话,您会在smoothView 和所有子视图中获得圆角......

enter image description here

好东西。