IPhoneでは、特定のポイントサイズに対して文字のサイズをピクセル単位で計算するにはどうすればよいですか?
ポイントサイズは 1/72インチとして定義 です。つまり、72ポイントのフォントは、最低の降下から最高の上昇まで約1インチです。したがって、72ptフォントのグリフの最大高さは約1インチです。
Appleのiphone技術仕様ページ iPhonecurrentlyの解像度は163ピクセル/インチであると主張しています。 72ポイントは163ピクセル、つまり1ポイントあたり約2.2639ピクセルです。すべてのグリフは高さと幅が異なるため、これはサイズの非常に大まかな見積もりであることに注意してください。一般に、 ベースライン 間の距離は、フォントのポイントサイズよりも少し大きくなるため、テキストの行が互いにクラッシュすることはありません。
正確な測定が必要な場合(そしておそらく必要です)、フォントメトリック情報を使用して実際にフォントグリフを測定する必要があります。 NSStringのUIKitの追加 を使用してこれを行うことができます。これにより、画面にレンダリングされたときに特定の文字列のサイズを測定できます。
IPhone4のフォントサイズ(ポイント単位)とPhotoshopのフォントサイズ(ポイント単位)を一致させるには、Photoshopドキュメントを144dpiに設定する必要があります。多くのテストを実行しましたが、それが1:1の結果を生成する解像度です。
手順:
上記の回答で言及した163dpiを含め、さまざまな解像度を試しましたが、144dpiで1:1の結果が得られることがわかりました。また、ポイントサイズがわかっているネイティブアプリに対してこれをテストし、144dpiも一致しました。
グラフィックアーティストは、特定のデバイスではポイントサイズではなくピクセルサイズを使用するように非常に限定的でした。以下の関数は、ピクセルサイズに基づいてフォントを返します。クローゼットフォントを見つけるためにブルートフォースメソッドを使用しますが、結果がキャッシュされるため、次回は非常に高速に戻ります。このコードをより良くする方法についてのコメントをいつも感謝しています。この関数は、utilsというクラスの静的クラスメンバーとして使用します。使用しているクラスに簡単に貼り付けることができます。それが助けになることを願っています。
/** return a font as close to a pixel size as possible
example:
UIFont *font = [Utils fontWithName:@"HelveticaNeue-Medium" sizeInPixels:33];
@param fontName name of font same as UIFont fontWithName
@param sizeInPixels size in pixels for font
*/
+(UIFont *) fontWithName:(NSString *) fontName sizeInPixels:(CGFloat) pixels {
static NSMutableDictionary *fontDict; // to hold the font dictionary
if ( fontName == nil ) {
// we default to @"HelveticaNeue-Medium" for our default font
fontName = @"HelveticaNeue-Medium";
}
if ( fontDict == nil ) {
fontDict = [ @{} mutableCopy ];
}
// create a key string to see if font has already been created
//
NSString *strFontHash = [NSString stringWithFormat:@"%@-%f", fontName , pixels];
UIFont *fnt = fontDict[strFontHash];
if ( fnt != nil ) {
return fnt; // we have already created this font
}
// lets play around and create a font that falls near the point size needed
CGFloat pointStart = pixels/4;
CGFloat lastHeight = -1;
UIFont * lastFont = [UIFont fontWithName:fontName size:.5];\
NSMutableDictionary * dictAttrs = [ @{ } mutableCopy ];
NSString *fontCompareString = @"Mgj^";
for ( CGFloat pnt = pointStart ; pnt < 1000 ; pnt += .5 ) {
UIFont *font = [UIFont fontWithName:fontName size:pnt];
if ( font == nil ) {
NSLog(@"Unable to create font %@" , fontName );
NSAssert(font == nil, @"font name not found in fontWithName:sizeInPixels" ); // correct the font being past in
}
dictAttrs[NSFontAttributeName] = font;
CGSize cs = [fontCompareString sizeWithAttributes:dictAttrs];
CGFloat fheight = cs.height;
if ( fheight == pixels ) {
// that will be rare but we found it
fontDict[strFontHash] = font;
return font;
}
if ( fheight > pixels ) {
if ( lastFont == nil ) {
fontDict[strFontHash] = font;
return font;
}
// check which one is closer last height or this one
// and return the user
CGFloat fc1 = fabs( fheight - pixels );
CGFloat fc2 = fabs( lastHeight - pixels );
// return the smallest differential
if ( fc1 < fc2 ) {
fontDict[strFontHash] = font;
return font;
} else {
fontDict[strFontHash] = lastFont;
return lastFont;
}
}
lastFont = font;
lastHeight = fheight;
}
NSAssert( false, @"Hopefully should never get here");
return nil;
}
特定のフォントとサイズのピクセルの高さを取得する最も簡単な方法は、NSStringでboundingRectメソッドを使用することです。 (ここでは@"Ap"
を使用して、子孫とアセンダーが含まれていることを確認しています。)
- (CGFloat)heightForFont:(UIFont *)font
{
NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
CGRect boundingRect = [@"Ap" boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX) options:NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:context];
return boundingRect.size.height;
}
Ppi(1インチあたりのポイント)はモニターごとに変わるため、ポイントをピクセルに確実に変換することはできません。読んでください。
そうは言っても、何人かの人々はあなたを始めるかもしれないいくつかの参照表と計算機をまとめました。
http://www.unitconversion.org/typography/postscript-points-to-pixels-x-conversion.html
私はそれらを理解するときにそれらを追加します:
12pt systemFontのsizedToFit UILabelの高さは15pxです。