【问题标题】:Font size for Retina displayRetina 显示屏的字体大小
【发布时间】:2012-08-08 23:29:01
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    字体大小以磅为单位,而不是以像素为单位。所以任何值都应该独立于 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];
    

    有效吗?

    【讨论】:

    • 我开始看到我的问题出在哪里:“所以任何值都应该独立于 Retina 分辨率” - 我需要以像素为单位指定文本大小,以便它与原始图形相匹配基于像素。
    • 虽然不完全像上面的代码那样工作。我无权访问该窗口,因此我不得不为主屏幕调用 backingScaleFactor。我也在 SDK 10.6 下工作,所以 backingScaleFactor 只能通过 NSInvocation 调用获得。然而,基本的想法是有效的,我会接受答案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 2012-12-03
    • 2015-05-02
    • 1970-01-01
    相关资源
    最近更新 更多