如何让 iOS 和 Android 支持自定义字体

本篇教程的目前源于我们团队设计师一直询问,iOS(iPhone/iPad) 和 Android 两个平台是否支持自定义字体的问题,恰巧前不久唐茶计划出了一个关于在中文阅读新体验的电子书应用:失控。里面提到中文的显示采用了香港字体设计室的全新中文黑体字:信黑体。于是我就在想看来 iOS 是可以支持自定义字体的。通过搜索和研究整理如下,供自己备份和大家参考

iOS

iOS 对字体以样式的支持是非常有限的(内嵌默认字库列表),尤其说对于用习惯了 HTML + CSS,就觉得 iOS 对字体的扩展真是逊到渣了,当然高人们已经准备为大众造福,出现了轻巧的 FontLableTTTAttributedLabel 开源库到怪兽级别 Three20 开源框架。但假如仅仅是想加载自定义字体来说,对于 iOS 4 版本还是比较简单的:

  1. 添加自定义字体文件做资源文件添加到 XCode 项目之中
  2. 在 info.plist 中新增一个名为 UIAppFonts 的 Key,类型是数组(array)
  3. 把新增的字体的文件名(包括后缀)依次填入 UIAppFonts 数组 (注意区分大小写)
  4. 保存 info.plist(废话)。准备工作完毕,下面是编码部分
@implementation CustomFontLabel

- (id)initWithCoder:(NSCoder *)decoder
{
    if (self = [super initWithCoder: decoder])
    {
        [self setFont: [UIFont fontWithName: @"Custom Font Name" size: self.font.pointSize]];
        // 这里 Custom Font Name 并不是字体的文件名,而且系统注册显示的字体标准名称,比如
        // 比如,微软雅黑,最好就用 Microsoft YaHei (不过这个会存在版权问题把 XD)
        // 另外,注意区分大小写
    }
    return self;
}

@end

这里还有更完整的关于 iOS 不同平台支持自定义字体的问答。

Android

Android 默认支持  Droid Sans,Droid Sans Mono 和 Droid Serif 三种字体,其实对于中文的显示还是很不错的,有些类似于微软雅黑字体(区别)。假如只是对默认的字体进行更换,最简单的方法就是配置 layout 文件:



    
     
     

但是这样肯定不能满足大家对于字体排版高一级的要求,下面是支持自定义字体的步骤:

首先,添加自定义字体文件放在项目的 assets/fonts 目录下面(目录可能需要自己创建)。

其次,编辑 layout 文件(这里做一个示范)



    
    

最后,在代码部分实现自定义字体(和 iOS 类似)

public void onCreate(Bundle savedInstanceState)
{
       super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        TextView textView = null;
        Button button = null;

        setFont(textView, "fonts/YaHei.ttf", R.id.text_view);
        setFont(button, "fonts/YaHei.ttf", R.id.button);
}

void setFont(TextView name, String path, int res)
{
    	name = (TextView) findViewById(res);
        Typeface font = Typeface.createFromAsset(this.getAssets(), path);
        name.setTypeface(font);
}

扩展阅读 [1] [2]

话说,为什么 Android 到现在都没有更多的开源的库和框架呢?

Colors: Mac 开发颜色辅助利器

Colors 是一个简单的颜色取色器,简单的有可能你都没有听说过它,虽然它对于平面设计师以及 Web 设计师不太看中,但它可是程序员中的一个实用利器,为什么这样说呢,看下面截图,除了基本的颜色取值外,还包括了 Mac 和 iOS(iPhone/iPad)对于类的取值。

等等,你说的不对,我下载了发现并没有 UIColor 的值,坑爹这不是,哈哈,非也,这个应用的最大好处在于可以自定义输出值。默认程序并没有 UIColor 这值。其实添加也很简单,在设置里(Command+逗号),添加一个名为 UIColor 的选项,其中只需要设置 GRB 的输出值和 Alpha 一样即可(Short Decimal over 1),输出格式使用 UIColor 的 RGBA 格式:

[UIColor colorWithRed:%r green:%g blue:%b alpha:%a]

后来发现这个应用是开源项目,且最后更新时间为 2009 年,难怪没有 UIColor 的输出值,有兴趣的朋友可以 Fork :https://github.com/13bold/Colors

为 ShareKit 增加国内相关微博/SNS 服务

在 iDev 圈内,众所周知 ShareKit 是一个家喻户晓的分享框架,很多人都在问哪有支持国内相关微博/SNS 服务(比如,新浪微博,腾讯微博,豆瓣,开心网,校内等)的类似框架或者谁去做贡献,造福那些拿来主义的人类。正好碰巧我刚刚接触 iOS 开发不久,为了验证文章开头的那段话,恰巧我开发的应用也需要设计这块的内容,我就只好啃下了这块“硬面包”,实际上在熟悉整个 ShareKit 的代码后,外加上对于 OAuth 协议又非常的了解,做一个扩展还是很轻松的,虽然我对 Objective-C 代码并不是很熟悉,这一切得益于 ShareKit。

ShareKit 在整体上,代码写的比较完美,对于新增的服务可以轻松实现,而且另外最最大的一个好处在于国内的这些服务实际上都是 Copy to China,这有大大减少了移植的开发量,比较恶心的事,国内为了证明我们的结构和功能不同于原版,对其有做了细微的调整,这就导致使用标准化的协议不能通过,这对于只是想用的人来说就是一种灾难。

天下事有难易乎?为之,则难者亦易矣;不为,则易者亦难矣。人之为学有难易乎?学之,则难者亦易矣;不学,则易者亦难矣。

上面是从 V2EX 某帖子挖出来的一个评论,实际上这段文字大家在学校的时候应该并不陌生,随后又看到了《凭什么是我们》这篇文章,更是印证了上面这段话。

为什么我要说上面这段和标题并不沾边的文字呢,实际上现在要发布的日志本来在我看来是非常没有必要的,因为这个项目我已经在 git 上面 fork 并贡献了关于国内相关微博/SNS 服务的代码,我以为大家可以通过搜索引擎搜索到,可想还是有人来问我,那好吧,为了减少询问我的次数,以及这篇日志的 SEO,我还是写下了这个日志。

Github 项目地址:https://github.com/icyleaf/ShareKit

衷心希望这个 fork 的代码对热情开发的人有所帮助!