我有一个用以下绘制的UIView:
- (void)drawRect:(CGRect)rect
{
UIBezierPath *bezierPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, self.widthOfLine, self.heightOfLine)];
[bezierPath fill];
}
,其框架在iOS窗口中居中。我想在这个视图中随机放置一堆较小的(5px乘5px)视图,我可以使用arc4random()函数并绘制视图。但是,我似乎无法弄清楚如何切断bezierPathWithOvalInRect之外的所有视图,它只会在第一个UIView框架中的任何位置显示它们。任何人都知道该怎么做?
编辑:
为清楚起见,我将另一个视图定义为:
- (void)drawRect:(CGRect)rect
{
UIBezierPath *drawPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(self.xPosition, self.yPosition, self.width, self.width)];
[[UIColor whiteColor] setFill];
[drawPath fill];
}
我将大量这些作为子视图添加到第一个视图中,但我希望它们不会显示在椭圆贝塞尔路径之外。有没有办法a)只在椭圆贝塞尔曲线路径中添加它们而不是在整个帧内,或者b)从视图中剪切椭圆形以外的所有曲线的方法?
答案 0 :(得分:6)
为了将所有子视图剪辑到特定的UIBezierPath,您将要设置视图的图层属性的蒙版属性。如果将layer.mask设置为该路径的CAShapeLayer,则所有子视图都将被裁剪到该路径。
我使用以下代码在我的应用中执行此操作:
// create your view that'll hold all the subviews that
// need to be clipped to the path
CGRect anyRect = ...;
UIView* clippedView = [[UIView alloc] initWithFrame:anyRect];
clippedView.clipsToBounds = YES;
// now create the shape layer that we'll use to clip
CAShapeLayer* maskingLayer = [CAShapeLayer layer];
[maskingLayer setPath:bezierPath.CGPath];
maskingLayer.frame = backingImageHolder.bounds;
// set the mask property of the layer, and this will
// make sure that all subviews are only visible inside
// this path
clippedView.layer.mask = maskingLayer;
// now any subviews you add won't show outside of that path
UIView* anySubview = ...;
[clippedView addSubview:anySubview];