服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS自定义字体显示问题的完美解决方法

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

2021-05-21 14:11从来吃不胖 IOS

这篇文章主要给大家介绍了关于iOS自定义字体出问题的完美解决方法,文中通过示例代码以及图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

前言

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

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

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

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

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

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

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

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

对比 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】文件:

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

3.3 修改字体文件中的信息

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?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 一下:

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

问题已解决!

4. demo地址

点击这里直达仓库

  • customfontissues 为字体有问题的工程
  • customfontissuesresolve 为已解决字体问题的工程

欢迎品尝~

总结

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

原文链接:https://juejin.im/post/5c7f93005188251ba41a0041

延伸 · 阅读

精彩推荐
  • IOS关于iOS自适应cell行高的那些事儿

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

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04