Установка прозрачного фона CGContext - PullRequest
50 голосов
/ 24 января 2010

Я все еще пытаюсь нарисовать линию с помощью 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 ]

70 голосов
/ 24 января 2010

После UIGraphicsGetCurrentContext() звоните CGContextClearRect(context,rect)

Edit: Хорошо, понял.

Ваш пользовательский вид со строкой должен иметь следующее:

- (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];
}
40 голосов
/ 28 января 2012

Простой способ:

- (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
}
4 голосов
/ 23 ноября 2014

Это то, что у меня работает с UIImage, который был добавлен вручную с помощью InterfaceBuilder.

- (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. Если вы создали UIView и вручную добавили его через Interface Builder, вам понадобится другой подход, такой как вызов метода initWithCoder.

3 голосов
/ 22 июня 2017

Инициируйте контекст с opaque == false, Swift 3

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

непрозрачный

Логический флаг, указывающий, является ли растровое изображение непрозрачным. Если вы знаете, что растровое изображение полностью непрозрачно, укажите true, чтобы игнорировать альфа-канал и оптимизировать хранилище растрового изображения. Задание false означает, что растровое изображение должно включать альфа-канал для обработки любых частично прозрачных пикселей.

3 голосов
/ 22 июня 2012

У меня такая же проблема, тогда я нахожу это. Я перезаписываю метод инициализации -(id)initWithFrame:(CGRect)rect. В этом методе self.background = [UIColor clearColor]; но я использую это представление в XIB-файле !!! Это вызовет метод инициализации

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

Так что перезаписать все метод init и настройка BackgroundColor будут работать нормально.

2 голосов
/ 26 сентября 2011
CGContextClearRect(context,rect) 

Если предоставленный контекст является контекстом окна или растрового изображения, Quartz эффективно очищает прямоугольник. Для других типов контекста Quartz заполняет прямоугольник в зависимости от устройства. Однако вы не должны использовать эту функцию в контекстах, отличных от оконных или растровых контекстов.

1 голос
/ 04 октября 2013

Вы можете создать контекст изображения с этим кодом:

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

ключ kCGImageAlphaPremultipliedLast.

0 голосов
/ 29 июля 2011

Проблемы с пониманием вопроса здесь, но если вы не можете получить «фоновое» представление UIView через «верхний» вид, в который вы рисуете, одно из решений - topView.backgroundColor = [UIColor clearColor]; У меня было (я думаю) это та же проблема, и это решило ее для меня.

...