Подтвердить что ты не робот

Настройка прозрачного фона 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);
}

Любые идеи?

4b9b3361

Ответ 1

После 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];
}

Ответ 2

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

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

Ответ 3

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

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

Итак, перезапишите все init. Метод и настройка BackgroundColor будет работать нормально.

Ответ 4

CGContextClearRect(context,rect) 

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

Ответ 5

Это то, что сработало для меня с 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.

Ответ 6

вы можете создать контекст изображения с помощью этого кода:

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

ключ - kCGImageAlphaPremultipliedLast.

Ответ 7

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

Ответ 8

Инициировать контекст с помощью opaque == false, Swift 3

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

непрозрачного

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