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) を指定しても機能しなくなったようです。

Retina ディスプレイと非 Retina ディスプレイの両方で適切に動作するように、このコードを修正するにはどうすればよいですか?

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 に答える