iphone graphics background transparent cgcontext

iphone - Configuración de un CGContext Fondo transparente



graphics background (8)

Todavía estoy luchando por trazar una línea con CGContext. De hecho, he ido a la línea para dibujar, pero ahora necesito que el fondo del Rect sea transparente para que se muestre el fondo existente. Aquí está mi código de prueba:

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

¿Algunas ideas?


Camino fácil:

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


Después de UIGraphicsGetCurrentContext() llama a CGContextClearRect(context,rect)

Editar: De acuerdo, lo tengo.

Su vista personalizada con la línea debe tener lo siguiente:

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

Mi prueba usó esto como un UIViewController muy básico:

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


Esto es lo que funcionó para mí con un UIImage que se había agregado manualmente usando 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); }

La respuesta de David Kanarek solo funciona cuando estás creando manualmente tu propio UIImageView. Si ha creado un UIView y lo ha agregado manualmente a través de Interface Builder, entonces necesitará un enfoque diferente como este llamando al método initWithCoder.


Inicia un contexto con opaque == false , Swift 3

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

opaco

Una marca booleana que indica si el mapa de bits es opaco. Si sabe que el mapa de bits es completamente opaco, especifique verdadero para ignorar el canal alfa y optimizar el almacenamiento del mapa de bits. Especificar falso significa que el mapa de bits debe incluir un canal alfa para manejar los píxeles parcialmente transparentes.


Si tiene problemas para entender la pregunta aquí, pero si no puede mostrar un fondo "UIView" a través de una vista "superior" en la que está dibujando, una solución es topView.backgroundColor = [UIColor clearColor]; Estaba teniendo (creo) este mismo problema y esto lo resolvió para mí.


Tengo el mismo problema, entonces me parece que es. Sobreescribo el método init es -(id)initWithFrame:(CGRect)rect. En este método self.background = [UIColor clearColor]; pero uso esta vista en el archivo xib !!! Eso llamará al método init es

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

Sobrescribir todo el método init y la configuración BackgroundColor funcionará bien.


puedes crear un contexto de imagen con este código:

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

la clave es kCGImageAlphaPremultipliedLast.


CGContextClearRect(context,rect)

Si el contexto proporcionado es una ventana o contexto de mapa de bits, Quartz efectivamente borra el rectángulo. Para otros tipos de contexto, Quartz llena el rectángulo de una manera dependiente del dispositivo. Sin embargo, no debe usar esta función en contextos que no sean contextos de ventanas o mapas de bits.