文档章节

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

Youth_关旋
 Youth_关旋
发布于 2016/07/25 11:30
字数 2634
阅读 27
收藏 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
枣庄
私信 提问
十八般武艺!移动应用开发者必备的18款利器

“工欲善其事,必先利其器”。身为一名移动应用的开发者,光有技术是不够的,必备的应用可以为您的开发工作如虎添翼。随着Android与iOS系统的不断更新换代,相关的的应用也层出不穷,本文推荐...

looen
2011/11/25
2.3K
3
开发iOS应用程序需要的工具和编程技术

似乎每个iOS应用开发学习者都是从这篇文章开始写博客的,我也不例外,也从这里写吧,内容雷同,但绝对是原创。因为一直相信,通过自己的理解写出来,是掌握技术一个很好的途径。 Xcode 苹果最...

鉴客
2012/01/09
4.7K
0
一年iOS工作经验,如何一举拿下百度、美团、快手等Offer面经(附面试题)

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

原来是泽镜啊
04/24
0
0
图灵四月书讯 ——经典与技术前沿的融合

本月,图灵重磅新书,一本是由Ronald L.Graham , Donald E.Knuth , Oren Patashnik 合著的《具体数学》,另一本是国内首本《iOS 6编程实战》。 世界顶级数学家和计算机科学家经典之作,无可...

生气的散人
2013/04/09
291
4
那些在学习iOS开发前就应该知道的事(part 1)

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

TomatosX
2015/06/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

jquery通过id显示隐藏

var $div3 = $('#div3'); 显示 $div3.show(); 隐藏 $div3.hide();

yan_liu
今天
3
0
《乱世佳人》读书笔记及相关感悟3900字

《乱世佳人》读书笔记及相关感悟3900字: 之前一直听「荔枝」,后来不知怎的转向了「喜马拉雅」,一听就是三年。上班的时候听房产,买房了以后听装修,兴之所至时听旅行,分手后听亲密关系,...

原创小博客
今天
3
0
大数据教程(9.6)map端join实现

上一篇文章讲了mapreduce配合实现join,本节博主将讲述在map端的join实现; 一、需求 实现两个“表”的join操作,其中一个表数据量小,一个表很大,这种场景在实际中非常常见,比如“订单日志...

em_aaron
今天
3
0
cookie与session详解

session与cookie是什么? session与cookie属于一种会话控制技术.常用在身份识别,登录验证,数据传输等.举个例子,就像我们去超市买东西结账的时候,我们要拿出我们的会员卡才会获取优惠.这时...

士兵7
今天
3
0
十万个为什么之为什么大家都说dubbo

Dubbo是什么? 使用背景 dubbo为什么这么流行, 为什么大家都这么喜欢用dubbo; 通过了解分布式开发了解到, 为适应访问量暴增,业务拆分后, 子应用部署在多台服务器上,而多台服务器通过可以通过d...

尾生
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部