2012-02-25 7 views
11

Ho bisogno di disegnare immagini in un CALayer perché ho bisogno di eseguire vari effetti, animazioni e filtri su di esso. Quando faccio un semplice disegno nel CGContext, qualunque cosa faccia, viene sempre disegnato in pixel ... Qual è il modo giusto per disegnare su un contesto in retina?CGContextDrawImage in Retina disegna l'immagine pixelata?

Questo è quello che sto facendo ora:

CGImageRef plateImage = [[UIImage imageNamed:@"someImage"] CGImage]; 
CGFloat width = CGImageGetWidth(plateImage), height = CGImageGetHeight(plateImage); 
CGFloat scale = [[UIScreen mainScreen] scale]; 

NSLog(@"Scale: %f\nWidth: %f\nHeight: %f", scale, width, height); 
CGContextTranslateCTM(_context, 0, height/scale); 
CGContextScaleCTM(_context, 1.0, -1.0); 

CGContextDrawImage(_context, CGRectMake(0, 0, width/scale, height/scale), plateImage); 

risposta

18

è necessario impostare la scala contenuto del livello appropriato.

myLayer.contentsScale = [UIScreen mainScreen].scale 
+0

Aaaaaa! Stavo cercando dappertutto nei documenti CG - non pensavo per un minuto che fosse un problema di livello! Grazie! – shein

+0

Incredibile. Grazie. – darkheartfelt

23

Ho avuto lo stesso problema ma la soluzione non sembrava funzionare.

UIGraphicsBeginImageContext() ha causato il mio problema. Sto postando la mia soluzione qui per i futuri utenti con lo stesso problema.

da iOS 4.0 si dovrebbe usare:

UIGraphicsBeginImageContextWithOptions(size, NO, 0.0); 

invece di

UIGraphicsBeginImageContext(size); 

Se non si desidera che le immagini pixel.

+0

Grazie! Non posso dire di capire perché funzioni, ma lo fa. – anonymouse

+2

Questa dovrebbe essere la risposta giusta! – Fydo

+2

Vale la pena notare che ho ottenuto i migliori risultati combinando questo con la risposta accettata: 'UIGraphicsBeginImageContextWithOptions (imageSize, NO, [UIScreen mainScreen] .scale);' – bplattenburg