Сглаживание выглядит иначе, чем системное, при использовании NSString drawAtPoint:

У меня есть пользовательский вид элемента статуса, в котором я рисую строку, используя NSString drawAtPoint:withAttributes:. При сравнении с системными часами с тем же текстом кажется, что в моем тексте отсутствует субпиксельное сглаживание и он выглядит немного зернистым. Нашел совет сместить точку рисования с (x,y) на (x+0.5,y+0.5), но это не помогло. Представление по умолчанию и setTitle: дают одинаковый результат.

Вот как это выглядит:

введите здесь описание изображения

Кажется, что у системных часов есть какая-то светло-серая рамка внизу, но я не смог ее имитировать, нарисовав строку второй раз светло-серым цветом.


person fjarri    schedule 10.06.2012    source источник


Ответы (3)


Я не вижу никакого «сглаживания шрифта» в системном рендеринге или в заголовках меню на моей машине. Если бы он был включен, вы бы увидели окрашенные в красный и синий цвета пиксели по краям символов, а не просто серые. Разница хорошо видна при увеличении.

Вы можете поэкспериментировать с включением или выключением субпиксельного позиционирования и квантования, используя CGContextSetShouldSubpixelPositionFonts, CGContextSetShouldSubpixelQuantizeFonts и т. д.

В остальном, основное отличие заключается в слабой белой тени при рендеринге системы. Попробуйте установка тени контекста со смещением {0,1} (или, может быть, {0,-1}, если ваш контекст перевернут?), размытием 0 или 1 и цветом 100% белого при 30% альфа - это выглядит довольно близко ко мне.

person Kurt Revis    schedule 10.06.2012
comment
Спасибо, Курт. Он по-прежнему не совсем похож на системный текст, но определенно намного лучше. Я думаю, это лучшее, что можно сделать, не заглядывая в исходный код OSX. - person fjarri; 10.06.2012

Пытаться:

CGContextRef  ctx = [NSGraphicsContext currentContext].graphicsPort;
CGContextSetShouldSmoothFonts(ctx, true);

Я тоже долго искал это. Получил это из видео WWDC (я думаю, это были «Лучшие практики для анимации какао»)

person paxos    schedule 20.01.2014

Я думаю, вы используете

    UIGraphicsBeginImageContext(<#CGSize size#>);

для инициализации контекста. На дисплеях Retina это приводит к размытию шрифтов. Использовать

    UIGraphicsBeginImageContextWithOptions(myFrameSize, NO, 0.0f);

вместо того, чтобы исправить это.

Кроме того, кажется, что если вы используете слой, установите себя в качестве делегата слоя и выполните рисование:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
    NSGraphicsContext *nsGraphicsContext;
    nsGraphicsContext = [NSGraphicsContext graphicsContextWithGraphicsPort:ctx
                                                                   flipped:NO];
    [NSGraphicsContext saveGraphicsState];
    [NSGraphicsContext setCurrentContext:nsGraphicsContext];

    // drawing here...

    [NSGraphicsContext restoreGraphicsState];
}

Это также будет работать.

person MPajak    schedule 14.11.2013