Качество изображения графического ядра сетчатки

17

Попытка понять, почему я получаю низкокачественный рисунок с помощью CGContextShowTextAtPoint? См. Прикрепленное изображение:

Буква «W» рисуется с использованием CGContextShowTextAtPoint на CALayer и выглядит очень пикселизированной. Кнопка рядом с ней - стандартная кнопка и выглядит так, как ожидалось. Я хотел бы, чтобы текст был hi-res.

    
задан vance 24.03.2011 в 05:05
источник

4 ответа

36

По умолчанию ваш CALayer не передает свой контент Quartz при более высоком разрешении экрана Retina. Вы можете включить это, используя следующий код:

if ([layer respondsToSelector:@selector(setContentsScale:)])
{
    layer.contentsScale = [[UIScreen mainScreen] scale];
}

Это повлияет не только на рендеринг текста, но и на весь ваш чертеж Quartz в CALayers, поэтому вам нужно будет сделать это для всех ваших слоев с пользовательским содержимым Quartz.

    
ответ дан Brad Larson 24.03.2011 в 17:08
  • Я не вижу contentScaleFactor на CALayer –  vance 25.03.2011 в 05:17
  • Спасибо, это contentsScale на CALayer: шкала CGFloat = [[UIScreen mainScreen]]; self.contentsScale = масштаб; –  vance 25.03.2011 в 05:33
  • Собственно, настройка содержимогоScale делает изображение очень размытым. См. Секунды в прикрепленном изображении. –  vance 25.03.2011 в 05:38
  • @vance - Ты прав. Я скопировал этот код с неправильного места, ссылаясь на UIView, а не на CALayer (теперь он исправлен). Размытость, скорее всего, связана либо с несоосностью пикселя вашего слоя или рисунка, либо с преобразованием, которое применяется после визуализации вашего текста. Убедитесь, что contentScale установлен до того, как ваш слой сначала отобразит его содержимое, или после этого используйте -setNeedsDisplay. Убедитесь, что ваш слой имеет начало координат в интегральных координатах пикселей. Помните, когда вы рисуете внутри слоя с помощью кварца, который вы хотите выровнять по полупиксельным координатам, а не целому. –  Brad Larson♦ 25.03.2011 в 15:55
5

Использует ли CGContextScaleCTM любые результаты для вас ? При работе с графическим контекстом, примерно так:

CGFloat scale = [[UIScreen mainScreen] scale];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextScaleCTM(context, scale, scale);
    
ответ дан Matt Bishop 24.03.2011 в 05:18
1

Группа функций управляет тем, как Core Graphics выделяет шрифты:

  • CGContextSetAllowsAntialiasing
  • CGContextSetAllowsFontSmoothing
  • CGContextSetAllowsFontSubpixelPositioning
  • CGContextSetAllowsFontSubpixelQuantization
ответ дан Steve 21.10.2011 в 09:06
0

Быстрая версия:

textLayer.contentsScale = UIScreen.mainScreen().scale

    

ответ дан Suragch 01.01.2016 в 16:04