我想知道是否可以将视图裁剪为Bezier路径。我的意思是,我希望只在封闭Bezier路径内部看到该视图。原因是我有一个不规则形状的轮廓,并且希望逐渐用纯色从上到下填充形状。如果我能够使某个视图仅在路径内可见,那么我可以简单地创建所需颜色的UIView,然后任意更改其框架的y坐标,有效地填充形状。如果有更好的实现方法,我将不胜感激。填充形状将与用户手指的y值匹配,因此它不能是连续动画。谢谢。
更新(很久以后):
我尝试了你的答案 Rob,结果很棒,除了一件事。我的意图是移动被遮罩的视图而保持遮罩在屏幕上的位置不变。这样我就可以给人们留下遮罩被视图“填满”的印象。问题是,根据您的答案编写的代码中,当我移动视图时,遮罩也会随之移动。我明白这是可以预料的,因为我所做的一切只是将它添加为视图的遮罩,因此如果与其联系的东西移动,它就会移动。我尝试将遮罩作为超级视图的子层添加,以使其保持不变,但结果非常奇怪。以下是我的代码:
更新(很久以后):
我尝试了你的答案 Rob,结果很棒,除了一件事。我的意图是移动被遮罩的视图而保持遮罩在屏幕上的位置不变。这样我就可以给人们留下遮罩被视图“填满”的印象。问题是,根据您的答案编写的代码中,当我移动视图时,遮罩也会随之移动。我明白这是可以预料的,因为我所做的一切只是将它添加为视图的遮罩,因此如果与其联系的东西移动,它就会移动。我尝试将遮罩作为超级视图的子层添加,以使其保持不变,但结果非常奇怪。以下是我的代码:
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;
}];
感谢已经提供的帮助。
self.test
的superview。superlayer的遮罩将影响子层,并且只会随着superlayer移动。 - Alex ZielenskiY
坐标计算一个矩形。然后在View
上调用setNeedsDisplay
。在View
的drawRect
中填充计算出的矩形。在整个过程中,只需让上述提到的CAShapeLayer
掩码存在 :):)(虽然我建议您使用路径裁剪,以获得更好的学习体验 :))。干杯! - devluv