Retina显示屏的字体大小

时间:2012-08-12 13:01:31

标签: objective-c macos cocoa font-size retina-display

我的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)不再有效。

如何修复此代码,使其适用于视网膜和非视网膜显示?

1 个答案:

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

结果:

Non-retina

Retina

如果您有不同显示模式的精确像素大小,请尝试以下方法:

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

有效吗?