2010-01-24 4 views
46

Я все еще борется с рисованием линии с CGContext. Я на самом деле иду на линию, чтобы рисовать, но теперь мне нужен фон Rect, чтобы он был прозрачным, чтобы продемонстрировать существующий фон. Вот мой тестовый код:Настройка A CGContext Прозрачный фон

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

Любые идеи?

ответ

70

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

Фон черный, должен быть фон iphone. Я на самом деле пытаюсь рисовать поверх UIView. –

+0

Я не совсем понимаю. Вы уверены, что добавили UIView в супервизор? Является ли этот drawRect в UIView, который вы хотите нарисовать поверх или в другом? Вы случайно установили цвет фона для этого UIView? –

+0

Спасибо за вопросы. Я бы ожидал, что IM добавит UIView в его супервизор. Прямоугольник рисования определенно находится в представлении, так как линия была правильно нарисована. Да, я установил фон в UIView, это тот фон, который я хочу показать через. Все, что я пытаюсь сделать, это нарисовать линию поверх существующего представления. Разочарованный в Сиэтле. –

0

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

2
CGContextClearRect(context,rect) 

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

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 
} 
+4

Я использую это для вспомогательного индикатора в ячейке таблицы. self.opaque = NO работает, а [self setBackgroundColor: [UIColor clearColor]] в принятом ответе нет. –

+0

self.opaque = false помог мне при создании пользовательского дополнительного представления UICollectionViewCell – ae14

+1

Это должен быть принятый ответ. self.opaque = NO делает вид с использованием drawRect прозрачным. Спасибо! – Michael

3

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

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

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

+1

Ничего из вышеперечисленного не работало для меня, даже если оно установлено в xib, просто установив его в код работает. +1 –

1

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

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

ключ kCGImageAlphaPremultipliedLast.

3

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

0

Иниц контекста с opaque == false, Свифт 3

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

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

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