使用NSString drawAtPoint时,平滑看起来与系统不同:

时间:2012-06-10 03:14:21

标签: objective-c cocoa fonts drawing smoothing

我有一个自定义状态项视图,我使用NSString的{​​{1}}绘制字符串。当与具有相同文本的系统时钟进行比较时,似乎我的文本缺少子像素平滑并且看起来有点颗粒感。我找到了一个建议,将绘图点从(x,y)转移到(x + 0.5,y + 0.5),但它没有帮助。默认视图和drawAtPoint:withAttributes:会产生相同的结果。

它的外观如下:

enter image description here

似乎系统时钟下面有一些浅灰色边框,但我无法通过第二次用浅灰色绘制字符串来模仿它。

3 个答案:

答案 0 :(得分:1)

我在系统的渲染或机器上的任何菜单标题中都没有看到任何“字体平滑”。如果它已打开,您会在字符边缘看到红色和蓝色的有色像素,而不仅仅是灰色。放大后差异非常明显。

您可能希望尝试使用打开或关闭子像素定位和量化 CGContextSetShouldSubpixelPositionFontsCGContextSetShouldSubpixelQuantizeFonts

否则,主要区别在于系统渲染中的微弱白色阴影。尝试setting the context's shadow偏移量为{0,1}(如果上下文被翻转,可能为{0,-1}),模糊为0或1,颜色为100%白色,30%alpha - - 看起来非常接近我。

答案 1 :(得分:0)

我猜你用

    UIGraphicsBeginImageContext(<#CGSize size#>);

用于上下文初始化。在视网膜显示器上,它会导致字体的模糊渲染。使用

    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];
}

它也可以。

答案 2 :(得分:0)

尝试:

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

我也在寻找那个很长一段时间。从WWDC视频中得到它(我认为它是“可可动画的最佳实践”)