2010-01-24 12 views
46

Todavía estoy luchando con 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:Configuración de CGContext Transparente Fondo

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

¿Alguna idea?

Respuesta

70

Después UIGraphicsGetCurrentContext() llamada CGContextClearRect(context,rect)

Editar: bien, lo consiguió.

la 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 utiliza esto como una 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]; 
} 
+7

El fondo es negro, debe ser el fondo del iphone. En realidad estoy tratando de dibujar encima de una UIView. –

+0

No lo entiendo del todo. ¿Estás seguro de que has agregado UIView a la supervista? ¿Es este drawRect en la UIView que desea dibujar sobre, o en uno diferente? ¿Estableció un color de fondo para esta UIView accidentalmente? –

+0

Gracias por las preguntas. Esperaría que IM agregara UIView a su super visión. El rectángulo de dibujo está definitivamente en la vista, ya que la línea se dibujó correctamente. Sí, he establecido un fondo en UIView, es ese fondo el que quiero mostrar. Todo lo que intento hacer es dibujar una línea sobre una vista existente. Frustrado en Seattle. –

0

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

2
CGContextClearRect(context,rect) 

Si el contexto proporcionado es una ventana o un contexto de mapa de bits, Quartz borra de manera efectiva 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.

40

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

Lo estoy usando para un indicador accesorio en una celda de vista de tabla. self.opaque = NO funciona mientras [self setBackgroundColor: [UIColor clearColor]] en la respuesta aceptada no. –

+0

self.opaque = false me ayudó al crear una subvista personalizada de una UICollectionViewCell – ae14

+1

Esta debería ser una respuesta aceptada. self.opaque = NO hace la vista usando drawRect, transparent. ¡Gracias! – Michael

3

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 !!! Que llamará al método init es

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

Así sobrescribir todo el método de inicio y configuración BackgroundColor va a funcionar bien.

+1

Ninguno de los anteriores funcionó para mí, a pesar de que está configurado en xib, solo lo configura en código. +1 –

1

se puede crear un marco 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.

3

Esto es lo que funcionó para mí con un UIImage que se había agregado manualmente utilizando 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á creando manualmente su 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.

0

Init un contexto con opaque == false, Swift 3

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

opaco

Un indicador booleano 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.