不要在UIBezierPath之外显示子视图

时间:2014-06-23 01:30:44

标签: objective-c cocoa-touch uiview uibezierpath

我有一个用以下绘制的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)从视图中剪切椭圆形以外的所有曲线的方法?

1 个答案:

答案 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];