最近,做了个小需求。因为app是使用的自定义字体,所以产品想让h5的字体跟app的字体一致,减少脱离感。而一般来说,app内的h5页面,都是显示系统的默认字体。要想使用自定义字体,一般的做法是在h5里面加上字体库,然后app端,在加载url的时候,会去下载这些字体。但是字体包一个动辄3,4M,要是有多个字体库的话,不用想,体验会很糟糕。所以这种下载的方式不太可行。但它的好处就是,在所有的浏览器上都支持。

指定font-family

搜索一番,发现可以直接指定font-family为iOS字体库的名字。比如app引用的是圆体,打开LaunchPad-->其他-->字体册,搜圆体,PostScript名称就正是我们需要的。如图。

 
1.png

然后在html中,或者css。这里为了方便,直接将样式写在了html中了。

.p1 {
font-family: "STYuanti-SC-Regular";
font-size: 30pt;
color: red;
} <p class='p1'>你好吗</p>

之后,在app里加载url,(o)/~,是不是变成圆体了。注意,这个前提是首先你得在app里加入圆体字体库,并添加到plist中。如下图。

 
plist.png

不过这种方式的缺点就是,只适用于iOS,因为字体库名是iOS内置字体库里面的。但是app都会有两端。所以此种方式,舍弃。

另寻出路

换个思路,既然字体库都已经在app内有了。可不可以直接借用呢?既省流量,又有好的体验。当然是可以的!!

在html/css内,这样写。使用font-face,src为字体库名称。

@font-face {
font-family: 'Yuanti-SC-Regular';
src: url('Yuanti-SC-Regular.ttf') format('truetype')
} .p1 {
font-family: "Yuanti-SC-Regular";
font-size: 30pt;
color: red;
}

用charles抓包发现,下载ttf的请求如下。

 
3.png

下载字体请求的url如下。

http://172.19.144.94/testFont/Yuanti-SC-Bold.ttf

跟使用本地图片的方式一样,可以用URLProtocol拦截请求,当检测到是ttf下载时,可以将本地的字体库读出来,直接将data返回。

于是乎,自定义CustomURLProtocol: NSURLProtocol。在AppDelegate注册。

[NSURLProtocol registerClass:[CustomURLProtocol class]];

关键代码:

- (void)startLoading
{
NSMutableURLRequest *mutableReqeust = [[self request] mutableCopy]; [NSURLProtocol setProperty:@YES forKey:URLProtocolHandledKey inRequest:mutableReqeust]; if ([[self.request.URL absoluteString] hasSuffix:@"ttf"]) {
// fontName
NSString *fontName = [[self.request.URL.absoluteString lastPathComponent] stringByDeletingPathExtension]; NSString *path = [[NSBundle mainBundle] pathForResource:fontName ofType:@"ttf"];
NSData *fontData = [NSData dataWithContentsOfFile:path]; NSURLResponse *response = [[NSURLResponse alloc] init]; [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
[self.client URLProtocol:self didLoadData:fontData];
[[self client] URLProtocolDidFinishLoading:self];
}else{
self.connection = [NSURLConnection connectionWithRequest:mutableReqeust delegate:self];
}
}

限制:由于WKWebView不能使用urlprotocol,所以只能在UIWebView中使用。

demo在此

说明一下,demo中的web文件夹,即为测试的html和css,如要本地测试,可放到Nginx服务器上,然后修改下demo中的url,便可看到效果。

作者:我落泪_情绪零碎
链接:https://www.jianshu.com/p/ac319f4c5daa
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

UIWebView使用app内自定义字体的更多相关文章

  1. iOS使用自定义字体的方法(内置和任意下载ttf\otf\ttc字体文件)

    最近做了个有关阅读的应用,使用了自定义字体,学习了一下这方面的知识. 1.首先是最简单也普遍的做法,打包内置字符库文件: 把字体库文件添加到工程,如font1.ttf添加到工程,然后在工程plist添 ...

  2. WebFont技术使用之如何在app中使用自定义字体

    参考 H5自定义字体解决方法(mark) 移动Web字体的使用 [原]移动web页面使用字体的思考 CSS @font-face规则 引用外部服务器字体

  3. 如何在移动端app中应用字体图标icon fonts (转)

    原文: http://www.cnblogs.com/willian/p/4166757.html?utm_source=tuicool&utm_medium=referral How to ...

  4. 如何在移动端app中应用字体图标icon fonts

    How to use icon fonts in your mobile apps 在任何APP设计中实现可图形的矢量缩放最完美的方式是使用字体图标. 移动端的设计变的越来越复杂.原因在于多样的屏幕尺 ...

  5. TextView的一些高级应用(自定义字体、显示多种颜色、添加阴影)

    1.    自定义字体可以使用setTypeface(Typeface)方法来设置文本框内文本的字体,而android的Typeface又使用TTF字体文件来设置字体所以,我们可以在程序中放入TTF字 ...

  6. iOS6:在你的App内使用Passbook

    前言 这是一篇翻译,感谢Jonathan Tang. 原文地址:iOS 6 Tutorial: Integrating Passbook into Your Applications 另外,看到另一篇 ...

  7. Android 中使用自定义字体的方法

    1.Android系统默认支持三种字体,分别为:“sans”, “serif”, “monospace 2.在Android中可以引入其他字体 . <?xml version="1.0 ...

  8. 转--Android中自定义字体的实现方法

    1.Android系统默认支持三种字体,分别为:“sans”, “serif”, “monospace 2.在Android中可以引入其他字体 . 复制代码 代码如下: <?xml versio ...

  9. Android实现自定义字体

    介绍 最近在看开源项目的时候,发现里面涉及到了自定义字体,虽然自己目前还用不到,但是动手demo笔记记录一下还是有必要的,没准哪天需要到这个功能. 原理 1.其实实现起来非常简单,主要是用到了Type ...

随机推荐

  1. sdn测量论文简介

    Prelude: Ensuring Inter-Domain Loop-Freedom in SDN-Enabled Networks 来源:APNet: The Asia-Pacific Works ...

  2. .NET Threadpool的一点认识

    说到.NET Threadpool我想大家都知道,只是平时比较零散,顾现在整理一下: 一码阻塞,万码等待:ASP.NET Core 同步方法调用异步方法“死锁”的真相 .NET Threadpool ...

  3. 好书推荐计划:Keras之父作品《Python 深度学习》

    大家好,我禅师的助理兼人工智能排版住手助手条子.可能非常多人都不知道我.由于我真的难得露面一次,天天给禅师做底层工作. wx_fmt=jpeg" alt="640? wx_fmt= ...

  4. Asp.net的HttpContext.Current.Items详解

    之前asp.net只是在使用Session来进行用户会话时的信息存储,甚至很少留意Session完整的类调用是HttpContext.Current.Sessoin.... 好吧,我还是处于只会固定写 ...

  5. php中urlencode与rawurlencode的区别

    前段时间说自己遇到了个<URL加号引发错误>的BUG,引起这个bug的原因就是自己在URL中使用了 urlencode 函数,该函数会把空格转换成加号,这样就导致URL解析出错,而空格只有 ...

  6. Docker 国内仓库和镜像

    Docker 国内仓库和镜像 由于网络原因,我们在pull Image 的时候,从Docker Hub上下载会很慢...所以,国内的Docker爱好者们就添加了一些国内的镜像(mirror),方便大家 ...

  7. MYSQL单表可以存储多少条数据???

    MYSQL单表可以存储多少条数据??? 单表存储四千万条数据,说MySQL不行的自己打脸吧. 多说一句话,对于爬虫来说,任何数据库,仅仅是存储数据的地方,最关心的是 能否存储数据和存储多少数据以及存储 ...

  8. The thumbprint of same asymmetric key is not same in 'SQL Server Connector for Microsoft Azure Key Vault' 1.0.4.0 and 'SQL Server Connector for Microsoft Azure Key

    https://support.microsoft.com/en-us/help/4470999/db-backup-problems-to-sql-server-connector-for-azur ...

  9. 从yield 到yield from再到python协程

    yield 关键字 def fib(): a, b = 0, 1 while 1: yield b a, b = b, a+b yield 是在:PEP 255 -- Simple Generator ...

  10. 应用间共享文件 FileProvider

    应用间共享文件 FileProvider 7.0及以上版本,分析文件给其他进程访问的时候,需要使用FileProvider,否则会出现崩溃: 例如:用系统下载器下载apk,然后通过Intent安装. ...