设置CGContext透明背景

时间:2010-01-24 01:38:55

标签: iphone graphics background transparent cgcontext

我仍然在努力用CGContext绘制一条线。我实际上去绘制线条,但现在我需要将Rect的背景透明,以便现有的背景显示出来。这是我的测试代码:

(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);
}

有什么想法吗?

8 个答案:

答案 0 :(得分:70)

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);
}

我的测试使用它作为一个非常基本的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];
}

答案 1 :(得分:40)

简单方法:

- (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
}

答案 2 :(得分:4)

对于使用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);
}
只有当您手动创建自己的UIImageView时,David Kanarek的回答才有效。如果你已经创建了一个UIView并通过Interface Builder手动添加它,那么你将需要一个不同的方法来调用initWithCoder方法。

答案 3 :(得分:3)

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

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

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

答案 4 :(得分:3)

使用opaque == false,Swift 3

初始化上下文
UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.main.scale) 

<强>不透明

  

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

答案 5 :(得分:2)

CGContextClearRect(context,rect) 

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

答案 6 :(得分:1)

您可以使用以下代码创建图像上下文:

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

密钥是kCGImageAlphaPremultipliedLast。

答案 7 :(得分:0)

在这里无法理解这个问题,但是如果你无法通过你正在绘制的“顶部”视图显示“背景”UIView节目,那么我有一个解决方案topView.backgroundColor = [UIColor clearColor];(我想)同样的问题,这解决了我。