4

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

这就是它的外观:

在此处输入图像描述

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

4

3 回答 3

1

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

您可能想尝试打开或关闭子像素定位和量化,使用 CGContextSetShouldSubpixelPositionFonts,CGContextSetShouldSubpixelQuantizeFonts等。

否则,主要区别确实是系统渲染中的微弱白色阴影。尝试将上下文的阴影设置为 {0,1} 的偏移量(或者如果您的上下文被翻转,则可能是 {0,-1}?),模糊 0 或 1,以及 100% 白色和 30% alpha 的颜色——看起来很接近我。

于 2012-06-10T04:29:57.120 回答
0

尝试:

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

我也找了很久。从 WWDC 视频中得到它(我认为这是“可可动画的最佳实践”)

于 2014-01-20T14:07:51.663 回答
0

I guess you use

    UIGraphicsBeginImageContext(<#CGSize size#>);

for context initialization. On retina displays it leads to blured renderings of fonts. Use

    UIGraphicsBeginImageContextWithOptions(myFrameSize, NO, 0.0f);

instead to fix it.

Also, it seems if you use a Layer, set yourself as the layer delegate and do your drawing in:

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

    // drawing here...

    [NSGraphicsContext restoreGraphicsState];
}

It will also work.

于 2013-11-14T10:17:18.330 回答