Ios 使用Bezier路径作为剪裁遮罩

Ios 使用Bezier路径作为剪裁遮罩,ios,objective-c,animation,clipping,Ios,Objective C,Animation,Clipping,我想知道是否有可能剪辑一个视图到贝塞尔路径。我的意思是,我只想在封闭贝塞尔路径内的区域中看到视图。这是因为我有一个不规则形状的轮廓,我想从上到下用纯色逐渐填充这个形状。如果我可以使某个视图只在路径中可见,那么我可以简单地创建一个我想要的颜色的UIView,然后根据我的意愿更改其框架的y坐标,有效地填充形状。如果有人对如何实现这一点有更好的想法,我们将不胜感激。对于记录,形状的填充将匹配用户手指的y值,因此它不能是连续动画。谢谢 更新(很长一段时间后): 我试过你的答案了,罗伯,除了一件事之外,它

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

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

我试过你的答案了,罗伯,除了一件事之外,它非常有效。我的意图是移动被遮罩的视图,而遮罩保持在屏幕上的相同位置。这是为了让我能给人的印象,面具是“填补”的看法。问题是,对于我根据您的答案编写的代码,当我移动视图时,遮罩也随之移动。我明白这是意料之中的,因为我所做的只是将其添加为视图的遮罩,这样,如果它所绑定的对象移动,它就会移动。我尝试将遮罩添加为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;
}];

已经感谢您的帮助。

您可以通过将视图的图层掩码设置为
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

作为Rob解决方案的一个例子,有一个
UIWebView
作为
UIView
子视图,称为
smoothView
smoothView
使用
bezierPathWithRoundedRect
制作圆形灰色背景(请注意右侧)。那很好

但如果
smoothView
只有普通剪辑子视图,则会得到以下结果:

如果按照Rob所说的做,您将在
smoothView
和所有子视图中获得圆角


很棒的东西。

Help needed@robmayoff请注意,这可以方便地剪辑所有子视图。太棒了。有趣的是(如果我没有弄错的话)“clip subviews”参数与此不“工作”:也就是说,如果你按照Rob在这里解释的做,它将像这样剪裁子视图,不管你是否打开或关闭“clip subviews”!尝试屏蔽
self.test的超级视图。超图层的遮罩会影响子图层,并且只会随超图层一起移动,而不会移动视图。我建议您使用用户手指上的
Y
coord来计算rect。然后在
视图上调用
setNeedsDisplay
。在视图的
drawRect
中,填充计算出的矩形。在整个过程中,让上面提到的
CAShapeLayer
mask出现:):(尽管我建议您使用路径剪辑,以获得更好的学习体验:)。干杯