字体大小以像素为单位

在iPhone上,如何计算给定磅值的字符大小(以像素为单位)?

点的大小定义为1/72英寸 。 也就是说,72点字体从最下降到最高上升大约1英寸。 所以72pt字体中字形的最大高度约为1英寸。

苹果的iphone tech specs页面声称iPhone 目前的分辨率为每英寸163像素。 所以72点是163像素,或每点约2.2639像素。 只要记住每个字形在高度和宽度上都有所不同,所以这是一个非常粗略的估计。 一般来说, 基线之间的距离会比字体的点大小大一点,这样文本行就不会相互碰撞。

如果你需要精确的测量(你可能会这样做),那么你需要使用字体度量信息来实际测量字体字形。 你可以通过使用NSString的UIKit添加 ,这将允许你测量一个特定的string时,在屏幕上显示的大小。

要在iPhone4上将字体大小(以点为单位)与Photoshop中的字体大小(以点数)相匹配,必须将Photoshop文档设置为144dpi。 我已经运行了许多testing,这就是产生1:1结果的分辨率。

脚步:

  • 在iPhone4上截取“设置»常规»辅助function»大文本”
  • 在Photoshop中打开截图
  • “Resample Image”(分辨率图像)closures,将分辨率从72dpi更改为144dpi
  • 在Photoshop中重新input文本(点数)以匹配截图中的大小

我经历了许多不同的解决scheme,包括上面答案中提到的163dpi,我发现144dpi会产生1:1的结果。 我也testing了一个本地应用程序,我知道点的大小和144dpi也匹配。

比较:

  • 并排比较
  • 任何人想要进一步探索这个分层的Photoshop文件

我们的graphics艺术家在某些设备上使用像素大小而不是点大小非常具体。 下面的函数将返回一个基于像素大小的字体。 它使用暴力方法来查找壁橱字体,但是随后caching结果,所以下次返回的速度会非常快。 我总是很欣赏这个代码如何做得更好。 我使用这个函数作为名为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; } 

我相信你正在寻找UIFont NSString扩展,它允许你计算给定一个UIFont的string的大小。

这是链接

特别是sizeWithFont方法。

获取给定字体和大小的像素高度的最简单方法是在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(每英寸点数)将从显示器变为显示器。 读一读;

http://hsivonen.iki.fi/units/

将像素转换为点

也就是说,有些人把几个参考表和计算器放在一起,可能会让你开始;

http://www.unitconversion.org/typography/postscript-points-to-pixels-x-conversion.html

http://sureshjain.wordpress.com/2007/07/06/53/

我会加上他们,因为我搞清楚了:

带有12pt systemFont的sizesToFit UILabel的高度是15px。