Ios 使用Bezier路径作为剪裁遮罩
我想知道是否有可能剪辑一个视图到贝塞尔路径。我的意思是,我只想在封闭贝塞尔路径内的区域中看到视图。这是因为我有一个不规则形状的轮廓,我想从上到下用纯色逐渐填充这个形状。如果我可以使某个视图只在路径中可见,那么我可以简单地创建一个我想要的颜色的UIView,然后根据我的意愿更改其框架的y坐标,有效地填充形状。如果有人对如何实现这一点有更好的想法,我们将不胜感激。对于记录,形状的填充将匹配用户手指的y值,因此它不能是连续动画。谢谢 更新(很长一段时间后): 我试过你的答案了,罗伯,除了一件事之外,它非常有效。我的意图是移动被遮罩的视图,而遮罩保持在屏幕上的相同位置。这是为了让我能给人的印象,面具是“填补”的看法。问题是,对于我根据您的答案编写的代码,当我移动视图时,遮罩也随之移动。我明白这是意料之中的,因为我所做的只是将其添加为视图的遮罩,这样,如果它所绑定的对象移动,它就会移动。我尝试将遮罩添加为superview的子层,以便它保持不变,但结果非常奇怪。这是我的密码:Ios 使用Bezier路径作为剪裁遮罩,ios,objective-c,animation,clipping,Ios,Objective C,Animation,Clipping,我想知道是否有可能剪辑一个视图到贝塞尔路径。我的意思是,我只想在封闭贝塞尔路径内的区域中看到视图。这是因为我有一个不规则形状的轮廓,我想从上到下用纯色逐渐填充这个形状。如果我可以使某个视图只在路径中可见,那么我可以简单地创建一个我想要的颜色的UIView,然后根据我的意愿更改其框架的y坐标,有效地填充形状。如果有人对如何实现这一点有更好的想法,我们将不胜感激。对于记录,形状的填充将匹配用户手指的y值,因此它不能是连续动画。谢谢 更新(很长一段时间后): 我试过你的答案了,罗伯,除了一件事之外,它
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出现:):(尽管我建议您使用路径剪辑,以获得更好的学习体验:)。干杯