我的Mac OS应用程序使用以下代码绘制一些文本:
void drawString(NSString* stringToDraw)
{
NSFontManager *fontManager = [NSFontManager sharedFontManager];
NSString* fontName = [NSString stringWithCString: "Helvetica" encoding: NSMacOSRomanStringEncoding];
NSFont* font = [fontManager fontWithFamily:fontName traits:0 weight:5 size:9];
NSMutableDictionary *attribs = [[NSMutableDictionary alloc] init];
[attribs setObject:font forKey:NSFontAttributeName];
[stringToDraw drawAtPoint:NSMakePoint (0, 0) withAttributes:attribs];
}
由于文本绘图是应用程序的一小部分,因此这种简单的方法到目前为止运作良好。但是现在有了新的视网膜显示器,用户抱怨文本看起来与其他图形相比太大了。似乎给出绝对字体大小(在我的情况下为9)不再有效。
如何修复此代码,使其适用于视网膜和非视网膜显示?
答案 0 :(得分:3)
字体大小以磅为单位,而不是以像素为单位。所以任何值都应该与Retina分辨率无关。例如,此代码可以正常工作:
- (void)drawRect:(NSRect)dirtyRect
{
CGRect textRect = CGRectInset(self.bounds, 15.0, 15.0);
[[[NSColor whiteColor] colorWithAlphaComponent:0.5] setFill];
NSRectFillUsingOperation(textRect, NSCompositeSourceOver);
NSFont *font = [[NSFontManager sharedFontManager] fontWithFamily:@"Helvetica"
traits:0.0
weight:5.0
size:30.0];
[@"Hello\nWorld" drawInRect:textRect
withAttributes:@{ NSFontAttributeName : font }];
}
结果:
如果您有不同显示模式的精确像素大小,请尝试以下方法:
CGFloat contentsScale = self.window.backingScaleFactor;
CGFloat fontSize = (contentsScale > 1.0 ? RETINA_FONT_SIZE : STANDARD_FONT_SIZE);
NSFont *font = [[NSFontManager sharedFontManager] fontWithFamily:@"Helvetica"
traits:0.0
weight:5.0
size:fontSize];
有效吗?