假设我有一个主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;
}
答案 0 :(得分:1)
创建位图图形上下文并将视图呈现到该上下文中。然后为每个DogView创建一个UIBezierPath,并使用moveToPoint
,addLineToPoint
和closePath
绘制DogView所在的轮廓。然后使用alpha为0.0调用fillWithBlendMode:alpha:
以清除图形的该区域。
我喜欢使用UIGraphicsBeginImageContext
来创建位图图形上下文,因为它只需要一个大小,您可以从视图的边界获取。这是一般框架。
UIGraphicsBeginImageContext( view.bounds.size );
CGContextRef context = UIGraphicsGetCurrentContext();
// drawing stuff goes here
UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();