CGContextDrawImage в Retina рисует изображение в пикселях? - PullRequest
11 голосов
/ 25 февраля 2012

Мне нужно рисовать изображения в CALayer, потому что мне нужно выполнять на нем различные эффекты, анимацию и фильтры.Когда я делаю простое рисование в CGContext, независимо от того, что я делаю, оно всегда рисуется в пикселях ... Как правильно рисовать контекст в сетчатке?

Вот что я делаю сейчас:

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

Ответы [ 3 ]

25 голосов
/ 31 декабря 2012

У меня была такая же проблема, но решение, похоже, не сработало.

UIGraphicsBeginImageContext() оказалось причиной моей проблемы. Я публикую свое решение здесь для будущих пользователей с такой же проблемой.

В iOS 4.0 вы должны использовать:

UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);

вместо

UIGraphicsBeginImageContext(size);

Если вам не нужны пиксельные изображения.

19 голосов
/ 25 февраля 2012

Вам необходимо соответствующим образом установить масштаб содержимого слоя.

myLayer.contentsScale = [UIScreen mainScreen].scale
0 голосов
/ 26 марта 2018

Обновлено решение @ Tieme для Swift 4

UIGraphicsBeginImageContextWithOptions(size, false, 0.0)

вместо

UIGraphicsBeginImageContext(size)
...