iOS自定义字体显示问题的完美解决方法

 更新时间:2019年03月07日 10:18:58   作者:从来吃不胖  
这篇文章主要给大家介绍了关于iOS自定义字体出问题的完美解决方法,文中通过示例代码以及图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

前言

本篇文章讲的是在实际项目中碰到一款自定义字体在展示上出现问题,然后运用先进的苹果爸爸的工具来解决这个问题的故事。

下面话不多说了,来一起看看详细的介绍吧

1. 自定义字体出什么问题了?

设计师们的作品总是千变万化,为了成就他们,作为程序员的我们只好满足他们喽。

所以当设计师用到一款神奇的字体的时候,我是不会拒绝的,就像下面这个样子:

为了让大家能更好的看到这个问题,我把 label 设置了一个背景色,label 的 width 和 height 都等于50。现在,在 storyboard 中看起来是没问题的,让我们 Run 一下:

对比 system font 字体的 label,明显感觉这个 DINCondensedC 字体的内容是偏上的!(当然不用对比也能发现)。WTF!

2. 解决思路

2.1 既然是内容偏上,那么是否和 content Mode 有关?

可惜的是,经过尝试,改变 contentMode 并不能对 UILabel 产生任何影响(实际绘制内容中包含下方的空白)。

结论:不可行

2.2 继承 UILabel 并重写 drawRect ?利用 CoreText 绘制字体?

这两种方案应该是可行的,但是,为了这个小字体,用得着这么复杂的【计算字体大小】-【通过字体大小与 label 高度计算偏移量】-【用到这个字体的 label 统一换成 XXLabel 】流程吗?

万一哪天设计师说:来,咱们来个富文本,中间这几个字用 DINCondensedC 字体,两边的字用 system 字体,那你不是要哭了?

结论:不可行

2.3 程序解决不了,那就用人解决吧

让我们找到可爱的设计师,请他喝个下午茶,搓顿不错的晚饭,带他做个大保健,然后和他说:兄弟这个UI图可以换个字体吗... 算了成本有点高。

结论:不可行

2.4 可否从字体入手,自己修改字体?

既然字体有点不太正常,那么我们只能使出大招:自己动手修改这个字体。据说有一款 App:Glyphs 对于制作/修改字体来说,很强大!然后让我们好好下载,静静等待吧。下载完毕打开这个【PT DIN Condensed Cyrillic.ttf】字体文件,没想到这个软件还收费,只能试用几天。试用就使用吧,但是,这个字体里的每个字符我都要一个一个去改?作为程序员,不能忍!

结论:不可行

3. 最终的解决方案

最后还是得靠苹果爸爸,大家的好爸爸。苹果提供了一款字体修改工具:Apple Font Tool Suite。下面就让我们用该工具来解决这个棘手的问题。

3.1 下载该工具

进入这里,滚到最下方,可以看到【Apple Font Tool Suite】,点击下方的下载,下载一个适合自己 Xcode 版本,下载完成后无脑安装。

3.2 获取字体的信息文件

打开终端,输入:ftxdumperfuser -t hhea -A d PT\ DIN\ Condensed\ Cyrillic.ttf,前面的【ftxdumperfuser -t hhea -A d 】为指令,后面的为你的字体文件路径。最后回车,你会看到同级文件夹下回多出一个【DINCondensedC.hhea.xml】文件:

3.3 修改字体文件中的信息

让我们打开这个字体文件,你会看到:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE hheaTable [
<!ELEMENT hheaTable EMPTY>
<!ATTLIST hheaTable versionMajor CDATA #IMPLIED
	versionMinor CDATA #IMPLIED
	ascender CDATA #IMPLIED
	descender CDATA #IMPLIED
	lineGap CDATA #IMPLIED
	advanceWidthMax CDATA #IMPLIED
	minLeftSideBearing CDATA #IMPLIED
	minRightSideBearing CDATA #IMPLIED
	xMaxExtent CDATA #IMPLIED
	caretSlopeRise CDATA #IMPLIED
	caretSlopeRun CDATA #IMPLIED
	caretOffset CDATA #IMPLIED
	metricDataFormat CDATA #IMPLIED
	numberOfHMetrics CDATA #IMPLIED
>
]>


<!--

	Data generated 	Sun Aug 13 18:51:10 2017

	Generated by ftxdumperfuser build 347,
		FontToolbox.framework build 257

	Font full name: 'PT DIN Condensed Cyrillic'
	Font PostScript name: 'DINCondensedC'

-->


<hheaTable
	versionMajor="1"
	versionMinor="0"
	ascender="700"
	descender="-209"
	lineGap="68"
	advanceWidthMax="889"
	minLeftSideBearing="-270"
	minRightSideBearing="-22"
	xMaxExtent="844"
	caretSlopeRise="1"
	caretSlopeRun="0"
	caretOffset="0"
	metricDataFormat="0"
	numberOfHMetrics="234"
	/>

没错这是个 XML 文件,它里面包含了字体的一些公共信息:

  • ascender:从字体的 baseLine 到最高处的距离
  • descender:从字体的 baseline 到最低点的距离
  • lineGap:印刷线的间距
  • ...

这里面的每一项信息,都可以从苹果的:hheaTable文档 这篇文档中找到。文档中可以看到,一款字体也是一个大工程。
今天我们要解决的,是【DINCondensedC】字体偏上的问题,因此,让我们来调节调节 ascender 这个属性,将它从700改为900,然后保存文件。

3.4 将修改完的文件注入原 ttf 文件

打开终端,输入:ftxdumperfuser -t hhea -A f PT\ DIN\ Condensed\ Cyrillic.ttf,注意这里 -A 后面的 d 已经换成了 f ,回车。

3.5 替换原工程中的字体文件

切回我们的工程,替换原字体文件,Run 一下:

问题已解决!

4. Demo地址

点击这里直达仓库

  • CustomFontIssues 为字体有问题的工程
  • CustomFontIssuesResolve 为已解决字体问题的工程

欢迎品尝~

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • iOS11上Xcode9 AppIcon 图标不显示

    iOS11上Xcode9 AppIcon 图标不显示

    升级到iOS11系统下自己的项目桌面app图标不见了,是什么原因呢,经过一番查找,终于发现问题所在,现在分享给大家
    2017-11-11
  • iOS内存管理中引用计数的学习

    iOS内存管理中引用计数的学习

    文章给大家分享了关于iOS内存管理中引用计数的相关知识点,对此有需要的朋友可以跟着学习下。
    2018-05-05
  • ios实现自动获取label高度、宽度及最后一个位置详解

    ios实现自动获取label高度、宽度及最后一个位置详解

    这篇文章主要给大家介绍了关于ios如何实现自动获取label高度、宽度及最后一个位置的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-10-10
  • 关于iOS GangSDK的使用 为App快速集成社群公会模块

    关于iOS GangSDK的使用 为App快速集成社群公会模块

    这篇文章主要介绍了iOS GangSDK的使用为App快速集成社群公会模块功能的实现过程。
    2017-11-11
  • iOS实现淘宝上拉进入详情页交互效果

    iOS实现淘宝上拉进入详情页交互效果

    最近遇到一个项目,项目中某个新需求的交互要求仿照淘宝上拉从下往上弹出宝贝详情。所以死打开淘宝APP仔细看了看,然后自己写了写,现在感觉效果差不多了,记录一下分享给大家,方法自己和大家需要的时候查看借鉴,感兴趣的朋友们下面跟着小编一起来学习学习吧。
    2016-11-11
  • 实例讲解iOS音乐播放器DOUAudioStreamer用法

    实例讲解iOS音乐播放器DOUAudioStreamer用法

    本篇文章给大家通过实例讲解了iOS音乐播放器DOUAudioStreamer用法以及分享了实例代码,一起学习参考下吧。
    2017-12-12
  • 关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一看看吧
    2018-11-11
  • iOS开发实现HTTPS之cer文件的使用详解

    iOS开发实现HTTPS之cer文件的使用详解

    下面小编就为大家分享一篇iOS开发实现HTTPS之cer文件的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • IOS如何替换电话号码中间4位为

    IOS如何替换电话号码中间4位为"-"符号

    这篇文章主要为大家详细介绍了IOS如何替换电话号码中间4位为-符号的方法,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • Objective-C 宏定义详细介绍

    Objective-C 宏定义详细介绍

    这篇文章主要介绍了Objective-C 宏定义详细介绍的相关资料,这样开发起来,更有效率,更好,更简洁,需要的朋友可以参考下
    2016-10-10

最新评论