2010-01-24 7 views
46

Sono ancora in difficoltà con il disegno di una linea con CGContext. In realtà sono andato in linea per disegnare, ma ora ho bisogno che lo sfondo di Rect sia trasparente, quindi lo sfondo esistente viene visualizzato attraverso. Ecco il mio codice di prova:Impostazione di uno sfondo trasparente 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); 
} 

Qualche idea?

risposta

70

Dopo UIGraphicsGetCurrentContext() chiamata CGContextClearRect(context,rect)

Edit: Va bene, capito.

la visualizzazione personalizzata con la linea dovrebbe avere il seguente:

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

Il mio test usato questo come un UIViewController molto di base:

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

Lo sfondo è nero, deve essere lo sfondo di iPhone. In realtà sto cercando di disegnare su un UIView. –

+0

Non seguo abbastanza. Sei sicuro di aver aggiunto l'UIView alla superview? È questo drawRect nell'IView in cui vuoi disegnare sopra o in uno diverso? Hai impostato un colore di sfondo per questo UIView accidentalmente? –

+0

Grazie per le domande. Mi aspetto che IM abbia aggiunto l'UIView alla sua superview. Il rettangolo di disegno è sicuramente nella vista, poiché la linea è stata disegnata correttamente. Sì, ho impostato uno sfondo in UIView, è quello sfondo che voglio mostrare attraverso. Tutto quello che sto cercando di fare è tracciare una linea sopra una vista esistente. Frustrato a Seattle. –

0

Avendo difficoltà a capire la domanda qui, ma se si' Non riesco a visualizzare un UIView "in background" attraverso una vista "top" in cui stai disegnando, una soluzione è topView.backgroundColor = [UIColor clearColor]; Avevo (penso) lo stesso problema e questo lo ha risolto per me.

2
CGContextClearRect(context,rect) 

Se il contesto è un contesto fornito finestra o bitmap, Quarzo cancella in modo efficace il rettangolo. Per altri tipi di contesto, Quartz riempie il rettangolo in modo dipendente dal dispositivo. Tuttavia, non utilizzare questa funzione in contesti diversi da contesti di finestre o bitmap.

40

Easy Way:

- (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 sto utilizzando per un indicatore accessorio in una cella di visualizzazione tabella. self.opaque = NO funziona mentre [self setBackgroundColor: [UIColor clearColor]] nella risposta accettata no. –

+0

self.opaque = false mi ha aiutato durante la creazione di una vista secondaria personalizzata di UICollectionViewCell – ae14

+1

Questa dovrebbe essere una risposta accettata. self.opaque = NO rende la vista usando drawRect, trasparente. Grazie! – Michael

3

Ho lo stesso problema, allora trovo che sia. Sovrascrivo il metodo init è -(id)initWithFrame:(CGRect)rect. In questo metodo self.background = [UIColor clearColor]; ma io uso questa vista nel file xib !!! Quello che chiamerà il metodo init è

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

Quindi sovrascrivere tutto il metodo di inizializzazione e impostazione BackgroundColor funzionerà correttamente.

+1

Nessuno dei precedenti ha funzionato per me, anche se è impostato su xib, è sufficiente impostarlo nel codice. +1 –

1

è possibile creare un contesto di immagine con questo codice:

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

la chiave è kCGImageAlphaPremultipliedLast.

3

Questo è ciò che ha funzionato per me con un UIImage che è stato aggiunto manualmente utilizzando 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 risposta di David Kanarek funziona solo quando si crea manualmente UIImageView. Se hai creato un UIView e lo hai aggiunto manualmente tramite Interface Builder, avrai bisogno di un approccio diverso come questo, chiamando invece il metodo initWithCoder.

0

Init un contesto con opaque == false, Swift 3

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

opaco

Un flag booleano che indica se il bitmap è opaco. Se si conosce che la bitmap è completamente opaca, specificare true per ignorare il canale alfa e ottimizzare la memoria della bitmap. Specificare false significa che la bitmap deve includere un canale alfa per gestire i pixel parzialmente trasparenti.