设置CGContext透明背景

我仍然在用CGContext绘制一条线。 我其实已经去画线,但是现在我需要Rect的背景是透明的,所以现有的背景显示通过。 这是我的testing代码:

(void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor(context, [UIColor clearColor].CGColor); CGContextSetAlpha(context,0.0); CGContextFillRect(context, rect); CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor); CGContextSetLineWidth(context, 5.0); CGContextMoveToPoint(context, 100.0,0.0); CGContextAddLineToPoint(context,100.0, 100.0); CGContextStrokePath(context); } 

有任何想法吗?

UIGraphicsGetCurrentContext()调用CGContextClearRect(context,rect)

编辑:好的,明白了。

您的自定义视图应该具有以下内容:

 - (id)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { [self setBackgroundColor:[UIColor clearColor]]; } return self; } - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); CGContextClearRect(context, rect); CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor); CGContextSetLineWidth(context, 5.0); CGContextMoveToPoint(context, 100.0,0.0); CGContextAddLineToPoint(context,100.0, 100.0); CGContextStrokePath(context); } 

我的testing使用这个作为一个非常基本的UIViewController:

 - (void)viewDidLoad { [super viewDidLoad]; UIImageView *v = [[UIImageView alloc] initWithFrame:self.view.bounds]; [v setBackgroundColor:[UIColor redColor]]; [self.view addSubview:v]; TopView *t = [[TopView alloc] initWithFrame:self.view.bounds]; [self.view addSubview:t]; [v release]; [t release]; } 

简单的方法:

 - (id)initWithFrame:(CGRect)frame { if ((self = [super initWithFrame:frame])) { self.opaque = NO; } return self; } - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); CGContextClearRect(context, rect); //your code } 

我有同样的问题,然后我发现它是。 我覆盖的init方法是-(id)initWithFrame:(CGRect)rect. 在这个方法中self.background = [UIColor clearColor]; 但我在xib文件中使用这个视图! 那会调用init方法

 -(id)initWithCoder:(NSCoder*)aDecoder; 

因此,覆盖所有的init方法和设置BackgroundColor将工作正常。

 CGContextClearRect(context,rect) 

如果提供的上下文是窗口或位图上下文,则Quartz会有效地清除该矩形。 对于其他上下文types,Quartz以与设备相关的方式填充矩形。 但是,您不应该在窗口或位图上下文以外的其他上下文中使用此函数。

这是使用InterfaceBuilder手动添加的UIImage为我工作的。

 - (id)initWithCoder:(NSCoder *)aDecoder { if(self = [super initWithCoder:aDecoder]) { self.backgroundColor = [UIColor clearColor]; } return self; } -(void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor); CGContextSetLineWidth(context, 5.0); CGContextMoveToPoint(context, 100.0,0.0); CGContextAddLineToPoint(context,100.0, 100.0); CGContextStrokePath(context); } 

David Kanarek的答案只有在您手动创build自己的UIImageView时才有效。 如果你已经创build了一个UIView并通过Interface Builder手动添加,那么你将需要一个不同的方法,像这样调用initWithCoder方法。

你可以用这个代码创build一个图片上下文:

 cacheContext = CGBitmapContextCreate (cacheBitmap, size.width, size.height, 8, bitmapBytesPerRow, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaPremultipliedLast); CGContextSetRGBFillColor(cacheContext, 0, 0, 0, 0); CGContextFillRect(cacheContext, (CGRect){CGPointZero, size}); 

关键是kCGImageAlphaPremultipliedLast。

无法理解这里的问题,但是如果你不能有一个“背景”UIView通过你正在绘制的“顶部”视图显示,一个解决scheme是topView.backgroundColor = [UIColor clearColor]; 我有(我认为)这个相同的问题,这解决了我的问题。

opaque == false Swift 3初始化上下文

 UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.main.scale) 

不透明

指示位图是否不透明的布尔标志。 如果您知道位图完全不透明,请指定true以忽略Alpha通道并优化位图的存储。 指定false意味着位图必须包含一个alpha通道来处理任何部分透明的像素。