根据子视图所在的位置,从UIView中屏蔽掉特定像素

时间:2014-03-20 21:55:37

标签: ios uiview quartz-graphics cgcontext quartz-2d

假设我有一个主UIView,它有几个CatView和DogView类型的子视图。我想将此UIView渲染为图像,但我想排除DogViews,以便最终渲染图像具有透明像素代替任何DogView。 (注意,简单地从视图中删除DogViews是行不通的 - 我需要DogViews所在的透明像素)。 DogViews也可以旋转,因此它们不一定占据视图的矩形部分。

关于如何处理这个问题的任何想法?

编辑:第一次尝试

- (UIImage *)createCutOutViewFromView:(UIView*)view {

    UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, 0.0);
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextMoveToPoint(context, 200, 200);
    CGContextAddLineToPoint(context, 250, 200);
    CGContextAddLineToPoint(context, 250, 250);
    CGContextAddLineToPoint(context, 200, 250);
    CGContextClosePath(context);

    CGContextClip(context);

    [view.layer renderInContext:context];

    UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return result;

}

结果是我只能看到我剪辑的50px矩形。我实际上想要看到除了这个矩形之外的一切。有什么建议吗?

编辑:第二次尝试

- (UIImage *)createCutOutViewFromView:(UIView*)view {

    UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, 0.0);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextClearRect(context, view.bounds);

    [view.layer renderInContext:context];

    UIBezierPath* path = [UIBezierPath bezierPath];
    [path moveToPoint:CGPointMake(200, 200)];
    [path addLineToPoint:CGPointMake(250, 200)];
    [path addLineToPoint:CGPointMake(250, 250)];
    [path addLineToPoint:CGPointMake(200, 250)];
    [path closePath];

    [path fillWithBlendMode:kCGBlendModeNormal alpha:0.0];


    UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();


    return result;

}

1 个答案:

答案 0 :(得分:1)

创建位图图形上下文并将视图呈现到该上下文中。然后为每个DogView创建一个UIBezierPath,并使用moveToPointaddLineToPointclosePath绘制DogView所在的轮廓。然后使用alpha为0.0调用fillWithBlendMode:alpha:以清除图形的该区域。

我喜欢使用UIGraphicsBeginImageContext来创建位图图形上下文,因为它只需要一个大小,您可以从视图的边界获取。这是一般框架。

UIGraphicsBeginImageContext( view.bounds.size );
CGContextRef context = UIGraphicsGetCurrentContext();

// drawing stuff goes here

UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();