我有一个自定义状态项视图,我使用NSString
的{{1}}绘制字符串。当与具有相同文本的系统时钟进行比较时,似乎我的文本缺少子像素平滑并且看起来有点颗粒感。我找到了一个建议,将绘图点从(x,y)转移到(x + 0.5,y + 0.5),但它没有帮助。默认视图和drawAtPoint:withAttributes:
会产生相同的结果。
它的外观如下:
似乎系统时钟下面有一些浅灰色边框,但我无法通过第二次用浅灰色绘制字符串来模仿它。
答案 0 :(得分:1)
我在系统的渲染或机器上的任何菜单标题中都没有看到任何“字体平滑”。如果它已打开,您会在字符边缘看到红色和蓝色的有色像素,而不仅仅是灰色。放大后差异非常明显。
您可能希望尝试使用打开或关闭子像素定位和量化
CGContextSetShouldSubpixelPositionFonts
,CGContextSetShouldSubpixelQuantizeFonts
等
否则,主要区别在于系统渲染中的微弱白色阴影。尝试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视频中得到它(我认为它是“可可动画的最佳实践”)