NSString
我有一个自定义状态项视图,我在其中使用's绘制字符串drawAtPoint:withAttributes:
。当与具有相同文本的系统时钟进行比较时,我的文本似乎缺少亚像素平滑并且看起来有点颗粒感。我找到了将绘图点从 (x,y) 转移到 (x+0.5,y+0.5) 的建议,但它没有帮助。默认视图并setTitle:
产生相同的结果。
这就是它的外观:
似乎系统时钟下面有一些浅灰色边框,但我无法通过第二次用浅灰色绘制字符串来模仿它。
NSString
我有一个自定义状态项视图,我在其中使用's绘制字符串drawAtPoint:withAttributes:
。当与具有相同文本的系统时钟进行比较时,我的文本似乎缺少亚像素平滑并且看起来有点颗粒感。我找到了将绘图点从 (x,y) 转移到 (x+0.5,y+0.5) 的建议,但它没有帮助。默认视图并setTitle:
产生相同的结果。
这就是它的外观:
似乎系统时钟下面有一些浅灰色边框,但我无法通过第二次用浅灰色绘制字符串来模仿它。
我在系统的渲染中或我机器上的任何菜单标题中都没有看到任何“字体平滑”。如果打开它,您会在字符边缘看到红色和蓝色的着色像素,而不仅仅是灰色。放大后差异非常明显。
您可能想尝试打开或关闭子像素定位和量化,使用
CGContextSetShouldSubpixelPositionFonts
,CGContextSetShouldSubpixelQuantizeFonts
等。
否则,主要区别确实是系统渲染中的微弱白色阴影。尝试将上下文的阴影设置为 {0,1} 的偏移量(或者如果您的上下文被翻转,则可能是 {0,-1}?),模糊 0 或 1,以及 100% 白色和 30% alpha 的颜色——看起来很接近我。
尝试:
CGContextRef ctx = [NSGraphicsContext currentContext].graphicsPort;
CGContextSetShouldSmoothFonts(ctx, true);
我也找了很久。从 WWDC 视频中得到它(我认为这是“可可动画的最佳实践”)
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.