文档章节

一文让你彻底了解iOS字体相关知识

Youth_关旋
 Youth_关旋
发布于 2016/07/25 11:30
字数 2634
阅读 17
收藏 0
点赞 0
评论 0

一文让你彻底了解iOS字体相关知识

 

iOS字体

招聘信息:

1.jpg

作者:董铂然 授权本站转载。

写本文的契机主要是把自己整理的关于iOS字体方面的知识不断更新写在这篇博文中,用来自己以后查阅。

一、iOS原生字体展示

在 label中选择字体的font,并把font由system改成custom后,就能在family中看到72种特殊字体。这些里面就有很炫的字体,但 是全部是只针对英文数字,对中文无效。写了一个程序把所有的原生样式遍历出来展示可以达到如下效果。可以清楚地看到每个字体对应的样式,不用再一个个试 了。 如果你不是在董铂然博客园看到本文,请点击查看原文。

blob.png

blob.png

blob.png

一 共是72种样式,我这个demo程序有两种展示方法,简洁展示和详细展示,简洁展示中只会把每个family的第一个font拿出来展示。最后一张图是详 细展示界面的。分了group展示,每个section对应一个family。可以看出苹果的原生字体还是有很多美观的字体,只是都仅对英文支持。

相信现在大部分的软件大部分的项目都是这么写代码的:

1

label.font = [UIFont systemFontOfSize:14];

如果不想用默认系统字体则需要使用此方法赋值:

1

UIFont *font = [UIFont fontWithName:@"Georgia" size:14];

这里传进Name里的参数是familyName而不是fontName。

二、获取family名称

那么如何获取这个family的名称?

方法1:在storyboard中或是xib中用label的图形化界面选中一个自己喜欢的样式,然后把名称记下写到代码中。

方法2:上面就有啊,从上面5张图中选吧。

方法3:(推荐)遍历

在UIFont类中有这些关于家族名和字体名的开放API,通过这些可以清晰的写个遍历打印,查看所有的familyName和其中包含的fontName

1

2

3

4

5

6

7

8

9

10

int i = 0;

for(NSString *fontfamilyname in [UIFont familyNames])

{

    NSLog(@"family:'%@'",fontfamilyname);

    for(NSString *fontName in [UIFont fontNamesForFamilyName:fontfamilyname])

    {

        NSLog(@"\tfont:'%@'",fontName);

    }

    NSLog(@"-------------%d",i++);

}

使用上面的代码即可遍历打印出所有的名称,然后从打印中复制名称到代码中个人感觉更为科学。

三、外界字体引入项目

本人亲测,在网上不管是windows字体,还是Android字体只要是ttf格式的,一般iOS程序都支持内嵌。

具体步骤也很简单:

1.将ttf文件拖入项目中

blob.png

2.修改plist文件,加入Fonts provided by application 配置,后面填上拖进来的项目名

blob.png

3.就可以在图形化界面看到新的字体选择了

blob.png

4.如果不想从IB界面找,建议使用一下上面的遍历打印,可以用循环打印数量来最直接的看是否导入成功,并找到自己需要的内容。

blob.png

5.运行项目得到自己想要的结果

blob.png

四、动态字体

动 态字体-Dynamic Type源于iOS7引入的一个文本渲染框架TextKit。主要的作用就是可以系统自设大小。当下的苹果已经做了越来越多的人性化的处理,甚至连盲人模 式都有。对于字体的展示也是考虑到了各人的喜好,有的人喜欢看大字,有的人喜欢看小字。在动态字体出来之前,有的应用也考虑到了此用户体验,比如网易新闻 以前就有能够在应用中设置偏好的字体大小功能。苹果也整合到了整个手机中,动态字体的思想就是:在setting中设置字体大小,不单单系统的字体会变,连应用程序中的字体大小也会随之改变。前提是你应用程序中的字体的代码写的符合要求。 

blob.png

前面的文章大部分说的都是要在字体中选custom,这时要考虑动态字体就有选 Text Styles中的选项了。

  • UIFontTextStyleHeadline

  • UIFontTextStyleBody

  • UIFontTextStyleSubheadline

  • UIFontTextStyleFootnote

  • UIFontTextStyleCaption1

  • UIFontTextStyleCaption2

这 些样式顾名思义,就不每个都列出显示效果了。标题,子标题,正文等等都是一些比较朴素。 我感觉这也就相当于word中的“样式”,把自己的每个章节的标题子标题选中设置成标题一或者标题二 然后就能用word的自动生成目录功能,并且一改某个样式里详细设置,每个标题子标题的格式也都会随之改变。 这里就是如果你在代码中把字体用这些样式,那你在手机setting里设置大小之后应用字体会有所反应。

设置字体的位置是: 设置-》显示与亮度-》文字大小

blob.png

如上左图是把尺寸调到了最大后的效果,下面的提示语只有到最大才会显示。 我试了下QQ里的字体设置的都是动态字体,微信和支付宝暂时还不支持动态大小,在字体尺寸设置很大后微信支付宝没反应,QQ则响应改变。上面右图是在iphone6上截到QQ客户端的展示效果。

设置动态字体的代码实现如下:

1

UIFont *font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline];

项目中建议把动态字体和自动布局结合起来用,以防止字体设置改变后出现错位Bug。 

五、字体描述符

字体描述符-UIFontDescriptor  也是TextKit的核心之一,大致意思就是:字体描述符可以把一个你不知道详情的font样式临时存起来做修改或赋值给别人使用。在使用了上面的动态字体之后,可能你只知道现在的text-Style但是详细的familyName,fontName都不知道是什么,这种情况下如果想修改字体的样式为斜体或粗体就只能使用这种方法:

1

2

3

4

5

6

// ------取出当前正文的字体样式

UIFontDescriptor *bodyFontDesciptor = [UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleBody];

// ------把样式改为斜体

UIFontDescriptor *italicFontDescriptor = [bodyFontDesciptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic];

// ------赋值给另一个label。

self.titleLabel.font = [UIFont fontWithDescriptor:italicFontDescriptor size:0.0];

关于样式一共有四种可选:

  • UIFontDescriptorTraitItalic

  • UIFontDescriptorTraitExpanded

  • UIFontDescriptorTraitCondensed

  • UIFontDescriptorTraitBold

字体描述符还有一个API是通过详细属性字典设置一个label的样式,写法如下 

1

2

3

4

5

6

7

UIFontDescriptor *attributeFontDescriptor = [UIFontDescriptor fontDescriptorWithFontAttributes:

    @{UIFontDescriptorFamilyAttribute: @"Avenir Next Condensed",

      UIFontDescriptorNameAttribute:@"AvenirNextCondensed-Italic",

      UIFontDescriptorSizeAttribute: @40.0,

      UIFontDescriptorMatrixAttribute:[NSValue valueWithCGAffineTransform:CGAffineTransformMakeRotation(M_1_PI*1.5)

      ]}];

label.font = [UIFont fontWithDescriptor:attributeFontDescriptor size:0.0];

这 上面分别设置了家族名,字体名,尺寸,形变,最后的size填0.0就可以,如果填了一个值,那这个值会把上面字典中的尺寸覆盖,感觉一般情况下应该不会 有人这么蛋疼用这种方法建样式,这个Attribute按command点进去还有很多,大多都是平时用不到的,有兴趣的可以一个一个钻研,好像一共有十 几个。

上面这段代码创建的label会显示成这样:

blob.png

六、扩展字体样式

上面说了原生全部不支持中文,但是我们用中文的人还是比较多,中文字体现在在网上搜索结果很多,但是大部分都不是想要的结果,要不就是不会让你那么简单下载的。我整理了一个常用的字体样式包,里面大致包括:

华文行楷,华文琥珀,华文新魏,隶书 等等这些熟悉的名字

纯净下载地址:http://pan.baidu.com/s/1hqfGdpE   密码:31qs

除了这些常用样式,还有一些非常规的字体样式,当然好的字体遇到时我会积累,并整理在下面,不要求多,只要求精。

纯净下载地址:http://pan.baidu.com/s/1i38etV3  密码:hnv7

blob.png

blob.png

如果有非常推荐的字体也欢迎告诉我 我整理在一起。

如果你不是在董铂然博客园看到本文,请点击查看原文

上面说的有个程序可以看到iOS所有字体的展示样式,下载地址在:https://github.com/dsxNiubility/SXFontShow

 

------------二、 iOS在应用中添加自定义字体-----------

 

摘要

开发某些娱乐性应用以及游戏时,个性的字体往往十分重要,这篇博客将介绍在项目中添加自定义的字体,并提供了一个小技巧。

iOS在应用中添加自定义字体

一、在应用中添加自定义字体的步骤

1、网上提供的字体库有很多,下载完成后,将其导入工程中,一般为ttf格式。

2、注意Build Phases中的Copy Bundle Resources中是否导入了文件:

3、在项目的info.plist文件中添加字体键值如下:

这个数组中可以添加多个元素,多个字体库。

4、这时实际上我们已经将字体添加进了工程中,但是在在使用这个字体时,字体的名字有时和文件名是不一样的,我们需要知道真实的字体名称,通常情况下,我们会讲所有字体名称打印出来:

    for (NSString * name in [UIFont familyNames]) {
        for (NSString * fo in [UIFont fontNamesForFamilyName:name]) {
           NSLog(@"%@",fo);
        }
    }

5、找到我们需要的字体,如下使用即可:

 UIFont * font = [UIFont fontWithName:@"yuweij" size:14];

二、如何快速的找到新添加的字体名字

        如果你将所有字体都打印了出来,在其中找到新的字体名称是身份困难的,尤其是当这个字体的名称和文件名相差甚远的时候,这是一件非常痛苦的事情。

        为了在以后使用自定义字体的时候不必一次一次的经历这样的痛苦,在Xcode6.3的环境下,我将所有的系统字体获取后写入了plist文件,将这个plist文件导入项目中,通过如下方法,可以只打印出新增加的字体:

    NSString *paths=[[NSBundle mainBundle]pathForResource:@"font" ofType:@"plist"];
    //得到完整的文件名
    NSDictionary * rootDic = [NSDictionary dictionaryWithContentsOfFile:paths];
    //遍历当前所有字体
    for (NSString * name in [UIFont familyNames]) {
        NSArray * fontArray = [rootDic objectForKey:name];
        BOOL tip = NO;
        for (NSString * fo in [UIFont fontNamesForFamilyName:name]) {
            for (NSString * tmp in fontArray) {
                if ([tmp isEqualToString:fo]) {
                    tip=YES;
                    break;
                }
            }
            if (!tip) {
                NSLog(@"%@",fo);
            }
        }
    }

如果你也需要,字体集plist文件的地址:https://github.com/ZYHshao/YHBaseFoundationTest/tree/master/YHBase/BaseSouce。------------------

© 著作权归作者所有

共有 人打赏支持
Youth_关旋
粉丝 2
博文 70
码字总数 23376
作品 0
枣庄
一年iOS工作经验,如何一举拿下百度、美团、快手等Offer面经(附面试题)

前言: 先简单说说我最近的面试经历吧。面试的公司很多,大部分最后都能得到令人满意的结果,我将这些体会记录下来,面了这么多公司,如果不留下什么,那岂不是太浪费了。对于我来说,这也是...

原来是泽镜啊
04/24
0
0
那些在学习iOS开发前就应该知道的事(part 1)

英文原文:Things I wish I had known before starting iOS development—Part 1 设计师设计出来了一个不错的引导界面,然而当我看到设计稿的时候,我们的app也没几天就要上线了。这个界面模...

TomatosX
2015/06/12
0
0
如何判断你是合格的高级iOS开发工程师?

前言 随着移动互联网的高速发展泄洪而来,有意学习移动开发的人越来越多了,竞争也是越来越大,需要学习的东西很多。如何才能在激烈的移动开发者竞争中一枝独秀,成为一名真正合格的高级iOS...

_小迷糊
05/26
0
0
CoreText 实现图文混排

NSTextView和Attribued String 第一次接触苹果系的富文本编程是在写Mac平台上的一个输入框的时候,输入框中的文字可以设置各种样式,并可以在文字中间插入图片,好在Mac的AppKit中提供了NST...

Megan_zhou
2014/05/26
0
0
10步成为专业iOS开发者——从零起步

想在移动开发大餐中分一杯羹,体验最火最炫的技术?小伙子,很有眼光嘛 毫无疑问,移动开发在目前和未来几年内都会盛极一时。无数开发职位虚位以待。各大公司都在寻找各种层次的程序员——新...

hejunbinlan
2015/06/18
0
0
转:基于IOS上MDM技术相关资料整理及汇总

一、MDM相关知识: MDM (Mobile Device Management ),即移动设备管理。在21世纪的今天,数据是企业宝贵的资产,安全问题更是重中之重,在移动互联网时代,员工个人的设备接入企业网络并查...

移动互联百科
2013/10/06
0
0
一步一步学习iOS 5编程(第三版)-PDF中文版-正式发布!

目前,这是第一本介绍iOS 5.x 和 Xcode 4.4 的中文版书籍,尤其适合于iOS 编程开发初学者。本教程由 EntLib.com 团队编写。如有任何技术问题,欢迎留言。 电子版 – PDF 格式,支持iPhone、i...

entlib
2012/09/20
0
2
(转)直接拿来用!最火的iOS开源项目(二)

“每一次的改变总意味着新的开始。”这句话用在iOS上可谓是再合适不过的了。GitHub上的iOS开源项目数不胜数,iOS每一次的改变,总会引发iOS开源项目的演变,从iOS 1.x到如今的iOS 7,有的项目...

孙启超
2013/06/21
0
1
定制iOS 7中的导航栏和状态栏

由于种种原因,申请了一个开源中国的帐号,也许会由于我的不耐心,不会亲自去一步步的写博文,但准备把自己看到的好的,都转载过来,就当时资源的存储,也算是一种推广吧。 iOS 7 教程:定制...

谁家的阿毛
2013/11/21
0
0
学习如何针对iOS 7进行开发?

  iOS 7已经发布了六个测试版,除了beta 6进行了小幅修正外,其他几个测试版都有不小的改动。昨天有消息说苹果将在9月10日发布iOS 7正式版,那么GM版很快将会与开发者见面。在iOS 7来临前夕...

fangzhou99
2013/09/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

conda 换源

https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add channels https://mir......

阿豪boy
6分钟前
0
0
Confluence 6 安装补丁类文件

Atlassian 支持或者 Atlassian 缺陷修复小组可能针对有一些关键问题会提供补丁来解决这些问题,但是这些问题还没有放到下一个更新版本中。这些问题将会使用 Class 类文件同时在官方 Jira bug...

honeymose
15分钟前
0
0
设计模式:代理模式

代理模式可以分为三种:静态代理,动态代理,cglib代理 1.静态代理:被代理的类需要实现一接口或是继承一父类 委托类(被代理的类): package com.java.pattern.proxy.staticdemo;publ...

人觉非常君
18分钟前
0
0
非常实用的IDEA插件之总结

1、Alibaba Java Coding Guidelines 经过247天的持续研发,阿里巴巴于10月14日在杭州云栖大会上,正式发布众所期待的《阿里巴巴Java开发规约》扫描插件!该插件由阿里巴巴P3C项目组研发。P3C...

Gibbons
24分钟前
0
0
Tomcat介绍,安装jdk,安装tomcat,配置Tomcat监听80端口

Tomcat介绍 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。 java程序写的网站用tomcat+jdk来运行...

TaoXu
24分钟前
0
0
TensorFlow,从一个 Android Demo 开始

TensorFlow Android Demo 项目地址 Machine Learning 既然提到了 TensorFlow,那是不是得神经网络、机器学习了解下? 如果你能坚持把 机器学习速成课程 给啃完了,觉得还挺有兴趣的,那可以考...

孟飞阳
26分钟前
0
0
JVM学习笔记二:内存结构规范

1、JVM基本结构图 2、java堆(Heap) 3、方法区(Method Area) 4、程序计数器 5、JAVA栈图解 局部变量表:八大基本类型,还可以存储引用类型 上一篇:JVM学习笔记一:类加载机制介绍...

刘祖鹏
31分钟前
0
0
mui集成微信H5支付(返回白屏问题已经解决)

一.项目需求 因为公司人员缺少,没有专门开发安卓和ios的人员,为了项目尽早上线采用了混合APP开发的方式,我选择了MUI混合开发框架,项目中需要在用户购买VIP会员的时候进行支付,所以需要在项目...

银装素裹
35分钟前
0
0
SpringBoot集成Redis--配置自定义的RedisCacheManager

配置自定义的RedisCacheManager--1自定义键生成规则 默认的键生成器 当不指定缓存的key时,SpringBoot会使用SimpleKeyGenerator生成key。 SimpleKeyGenerator SimpleKey 查看源码可以发现,它...

karma123
55分钟前
0
0
防火墙未来的发展趋势在哪里?

导读 防火墙(Firewall),也称防护墙,是由Check Point创立者Gil Shwed于1993年发明并引入国际互联网。当下互联网时代,无论是大小企业,大部分都会部署有防火墙的设备,但这些防火墙往往并不...

问题终结者
57分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部