自定义安装的字体在UILabel中无法正确显示

时间:2011-03-24 04:23:00

标签: ios ios4 fonts uilabel uifont

我正在尝试使用从Adobe Font Collection Pro Package获得的 Helvetica Neue Condensed 字体。不幸的是,当我在UILabel中使用它时,它似乎绘制不正确。

行高似乎是正确计算的(我认为),但是当显示字体时,它会与边界框的最顶部对齐。我调用[myLabel sizeToFit]并仅调整宽度以产生此屏幕捕获:

Screen capture of incorrect font rendering

我对字体的粗体和常规版本都有同样的问题。我能够从OSX中取出一个 Helvetica Neue Bold 的版本并将其放在我的设备上并显示正常(上图中的绿色背景)。

字体文件或我的代码导致它以这种方式绘制可能有什么问题?

13 个答案:

答案 0 :(得分:120)

我发布了一个解决方案,涉及修补ttf字体文件here

这是适用于我的自定义字体的解决方案,在UILabel,UIButton等中存在相同的问题。事实上,字体的问题是它的上升属性与系统字体的值相比太小了。 Ascender是字体字符上方的垂直空格。要修复字体,您必须下载Apple Font Tool Suite命令行实用程序。然后取出你的字体并执行以下操作:

~$ ftxdumperfuser -t hhea -A d Bold.ttf

这将创建Bold.hhea.xml。使用文本编辑器打开它并增加ascender属性的值。您将需要进行一些实验,以找出最适合您的确切值。在我的情况下,我将其从750更改为1200.然后使用以下命令行再次运行该实用程序,将您的更改合并回ttf文件:

~$ ftxdumperfuser -t hhea -A f Bold.ttf

然后在您的应用中使用生成的ttf字体。

答案 1 :(得分:64)

所以这是 kolyuchiy的答案的修改版本。

我用Glyphs打开了我的字体,然后导出它而不修改任何内容。不知何故,神奇地,垂直对齐问题消失了!

更好的是新字体与sizeWithFont:等方法很好地配合,因此它没有 Joshua 提到的问题。

我用kolyuchiy提到的命令查看了HHEA表,并注意到Glyphs不仅修改了ascender,还修改了lineGapnumberOfHMetrics

以下是原始数据:

versionMajor="1"
versionMinor="0"
ascender="780"
descender="-220"
lineGap="200"
advanceWidthMax="1371"
minLeftSideBearing="-73"
minRightSideBearing="-52"
xMaxExtent="1343"
caretSlopeRise="1"
caretSlopeRun="0"
caretOffset="0"
metricDataFormat="0"
numberOfHMetrics="751"

之后:

versionMajor="1"
versionMinor="0"
ascender="980"
descender="-220"
lineGap="0"
advanceWidthMax="1371"
minLeftSideBearing="-73"
minRightSideBearing="-52"
xMaxExtent="1343"
caretSlopeRise="1"
caretSlopeRun="0"
caretOffset="0"
metricDataFormat="0"
numberOfHMetrics="748"

故事的寓意 - 不仅仅是增加上升者,还要修改其他相关价值观。

我不是排版专家所以我无法解释原因和方法。如果有人能提供更好的解释,我们将不胜感激! :)

答案 2 :(得分:31)

iOS 6尊重字体的lineGap属性,而iOS 7则忽略它。因此,只有线间距为0的自定义字体才能在两个操作系统中正常工作。

解决方案是使lineGap 0并使ascender相应更大。根据上面的answer,一种解决方案是从Glyphs导入和导出。但请注意,该应用的未来版本可能会修复此“错误”。

更强大的解决方案是按照post自行编辑字体。具体地,

  1. 安装OS X字体工具。
  2. 将字体指标转储到文件:ftxdumperfuser -t hhea -A d YOUR_FONT.ttf
  3. 在编辑器中打开转储文件。
  4. 通过向ascender属性添加lineGap属性的值来编辑lineGap属性。例如,如果ascender为200而ascender为750,则设为lineGap 950。
  5. ftxdumperfuser -t hhea -A f YOUR_FONT.ttf设置为0。
  6. 将更改合并到字体中:{{1}}
  7. 执行此操作后,您可能需要相应地调整UI。

答案 3 :(得分:4)

  1. 在此处下载并安装Apple的字体工具:https://developer.apple.com/downloads/index.action?q=font(下载链接位于底部)
  2. 打开终端,然后按照您的方式前往
  3. 运行此命令:ftxdumperfuser -t hhea -A d MY_FONT_NAME.ttf
  4. 现在您有一个包含某些字体属性的xml文件,在文本编辑器中进行编辑
  5. 搜索“lineGap”属性并为其值
  6. 添加200
  7. 保存xml文件
  8. 运行此命令:ftxdumperfuser -t hhea -A f MY_FONT_NAME.ttf
  9. 删除xml文件
  10. 在iOS 6上尝试配置的字体,看看它是否更好。
  11. 如果需要,可以返回步骤3并添加/减去“lineGap”属性。 (我最终为我的配置添加了250)

答案 4 :(得分:4)

对于那些运行OS X El Capitan并进入此主题的人,您可能已经注意到Apple Font Tool Suite不再兼容(至少目前为止)。

但您仍然可以使用免费的字体编辑软件FontForge执行 kolyuchiy Joseph Lin 所描述的更改。

使用FontForge打开字体并在顶部菜单中选择元素,然后转到字体信息> OS / 2>指标。在那里,您需要编辑HHEad线间隙和HHead Ascent Offset值。

完成必要的修改后,您只需在文件>中导出字体即可。生成字体并选择正确的字体格式

答案 5 :(得分:3)

我们的一种自定义字体遇到了同样的问题。我们还通过编辑字体ascender属性来“修复”问题。但是,我们发现这会产生其他问题和布局问题。例如,使用我们的上升编辑字体时,根据标签高度动态设置单元格高度会爆炸。

我们最终做的是更改UIButton contentEdgetInsets属性。

yourButton.contentEdgeInsets = UIEdgeInsetsMake(-10, 0, 0, 0);

不确定哪种方法更好,但只想分享另一种方法来解决问题。

答案 6 :(得分:3)

感谢这个answer我用Glyph修复了我的问题,但有点不同。

我用Glyphs打开我的字体(也可以使用Glyphs mini)并在那里找到这个部分(这来自Glyphs mini,在右上角按下i按钮):

enter image description here

只需删除所有这些对齐区域(或其中一些),它就可以解决此问题。 对我来说很完美。

答案 7 :(得分:1)

你试过Core Text吗?我通过Core Text渲染自定义字体有一些成功,但我不知道它是否适合你的情况。

答案 8 :(得分:1)

我曾经使用过https://github.com/fonttools/fonttools-非常易于使用且免费。在我的情况下,“ hhea”表中的“ ascender” = 1000和“ lineGap” = 0的更改可以解决问题。

根据Trevor Harmon https://medium.com/@thetrevorharmon/how-to-use-apples-font-tools-to-tweak-a-font-a386600255ae的文章

答案 9 :(得分:0)

如果您在使用这些命令行实用程序时遇到问题,请在窗口中尝试使用fontcreator。并从其设置菜单中更改字体组合。

答案 10 :(得分:0)

从您的标签文本创建属性文本对我来说是解决方法。继承人:

extension UILabel {
    /// You can call with or without param values; without will use default 2.0
    func setLineSpacing(lineSpacing: CGFloat = 2.0, lineHeightMultiple: CGFloat = 2.0) {
        guard let labelText = self.text else { return }
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = lineSpacing
        paragraphStyle.lineHeightMultiple = lineHeightMultiple
        let attributedString:NSMutableAttributedString
        if let labelattributedText = self.attributedText {
            attributedString = NSMutableAttributedString(attributedString: labelattributedText)
        } else {
            attributedString = NSMutableAttributedString(string: labelText)
        }
        // (Swift 4.2 and above) Line spacing attribute
        attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))
        self.attributedText = attributedString
    }
}

对于我的自定义字体,我从以下位置获得了所需的结果:

self.myLabel.setLineSpacing(lineSpacing: 1.2, lineHeightMultiple: 1.2)

这可以通过使用本机提供的NSMutableParagraphStyle()来实现,其中包含行高和间距属性(如果不对标签进行编程,也可以在情节提要中作为@IBOutlet属性访问)。

答案 11 :(得分:0)

对于由于找不到命令错误而在Mac OS Mojave上努力使用.appbody{ min-height: calc(100vh - 65px); margin-top: 65px; /* Clear the space for the app bar above */ } kolyuchiy答案)的任何人:

  • 从Apple下载字体工具包。在找到他们 https://developer.apple.com/download/more/?q=font,为 XCode11。
  • 安装dmg文件
  • 输入磁盘映像cd / Volumes / macOS \ 字体\工具
  • 将软件包提取到您选择的文件夹中:pkgutil --expand-full macOS \ Font \ Tools.pkg〜/ font-tools
  • 现在可以在〜/ font-tools / FontCommandLineTools.pkg / Payload中使用CLI工具,您可以 可以将文件夹添加到您的路径(function App() { const [list, setList] = useState([]); const [name, setName] = useState(''); const [editIndex, setEditIndex] = useState(null); const handleSubmit = () => { if(editIndex) { setList([...list.slice(0, index), name, ...list.slice(index+1)]) setEditIndex(null) } else { setList([...list, name]); } setName('') } return ( <div className="App"> <UserForm name={name} setName={setName} handleSubmit={handleSubmit}></UserForm> <UserGrid setEditIndex={setEditIndex} list={list}></UserGrid> </div> ); } ),或将utils复制到您的bin中 文件夹。

答案 12 :(得分:-2)

我在Sprite Kit游戏中遇到了与标志性“FontAwesome”字体类似的问题。 将SKLabelNode的SKLabelVerticalAlignmentMode属性设置为.Center对我有用。

myLabel.verticalAlignmentMode = SKLabelVerticalAlignmentMode.Center

只是想分享一些人会遇到同样的问题。

相关问题