3

我的 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];
}

由于文本绘图在应用程序中只占很小的一部分,因此这种简单的方法到目前为止效果很好。但是现在有了新的 Retina 显示屏,用户抱怨文本与其他图形相比显得太大了。似乎给出绝对字体大小(在我的情况下为 9)不再有效。

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

4

1 回答 1

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

它有效吗?

于 2012-08-12T13:03:47.270 回答