UIWebView使用app内自定义字体
最近,做了个小需求。因为app是使用的自定义字体,所以产品想让h5的字体跟app的字体一致,减少脱离感。而一般来说,app内的h5页面,都是显示系统的默认字体。要想使用自定义字体,一般的做法是在h5里面加上字体库,然后app端,在加载url的时候,会去下载这些字体。但是字体包一个动辄3,4M,要是有多个字体库的话,不用想,体验会很糟糕。所以这种下载的方式不太可行。但它的好处就是,在所有的浏览器上都支持。
指定font-family
搜索一番,发现可以直接指定font-family为iOS字体库的名字。比如app引用的是圆体,打开LaunchPad-->其他-->字体册,搜圆体,PostScript名称就正是我们需要的。如图。
然后在html中,或者css。这里为了方便,直接将样式写在了html中了。
.p1 {
font-family: "STYuanti-SC-Regular";
font-size: 30pt;
color: red;
}
<p class='p1'>你好吗</p>
之后,在app里加载url,(o)/~,是不是变成圆体了。注意,这个前提是首先你得在app里加入圆体字体库,并添加到plist中。如下图。
不过这种方式的缺点就是,只适用于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的请求如下。
下载字体请求的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中的web文件夹,即为测试的html和css,如要本地测试,可放到Nginx服务器上,然后修改下demo中的url,便可看到效果。
作者:我落泪_情绪零碎
链接:https://www.jianshu.com/p/ac319f4c5daa
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
UIWebView使用app内自定义字体的更多相关文章
- iOS使用自定义字体的方法(内置和任意下载ttf\otf\ttc字体文件)
最近做了个有关阅读的应用,使用了自定义字体,学习了一下这方面的知识. 1.首先是最简单也普遍的做法,打包内置字符库文件: 把字体库文件添加到工程,如font1.ttf添加到工程,然后在工程plist添 ...
- WebFont技术使用之如何在app中使用自定义字体
参考 H5自定义字体解决方法(mark) 移动Web字体的使用 [原]移动web页面使用字体的思考 CSS @font-face规则 引用外部服务器字体
- 如何在移动端app中应用字体图标icon fonts (转)
原文: http://www.cnblogs.com/willian/p/4166757.html?utm_source=tuicool&utm_medium=referral How to ...
- 如何在移动端app中应用字体图标icon fonts
How to use icon fonts in your mobile apps 在任何APP设计中实现可图形的矢量缩放最完美的方式是使用字体图标. 移动端的设计变的越来越复杂.原因在于多样的屏幕尺 ...
- TextView的一些高级应用(自定义字体、显示多种颜色、添加阴影)
1. 自定义字体可以使用setTypeface(Typeface)方法来设置文本框内文本的字体,而android的Typeface又使用TTF字体文件来设置字体所以,我们可以在程序中放入TTF字 ...
- iOS6:在你的App内使用Passbook
前言 这是一篇翻译,感谢Jonathan Tang. 原文地址:iOS 6 Tutorial: Integrating Passbook into Your Applications 另外,看到另一篇 ...
- Android 中使用自定义字体的方法
1.Android系统默认支持三种字体,分别为:“sans”, “serif”, “monospace 2.在Android中可以引入其他字体 . <?xml version="1.0 ...
- 转--Android中自定义字体的实现方法
1.Android系统默认支持三种字体,分别为:“sans”, “serif”, “monospace 2.在Android中可以引入其他字体 . 复制代码 代码如下: <?xml versio ...
- Android实现自定义字体
介绍 最近在看开源项目的时候,发现里面涉及到了自定义字体,虽然自己目前还用不到,但是动手demo笔记记录一下还是有必要的,没准哪天需要到这个功能. 原理 1.其实实现起来非常简单,主要是用到了Type ...
随机推荐
- 转 asp.net mvc 身份验证中返回绝对路径的ReturnUrl
原文:http://www.cnblogs.com/hyl8218/archive/2011/11/22/2259116.html 从HttpUnauthorizedResult的源码可以看出,Htt ...
- 基于nginx+xxl-job+springboot高可用分布式任务调度系统
技术.原理讲解: <分布式任务调度平台XXL-JOB--源码解析一:项目介绍> <分布式任务调度平台XXL-JOB--源码解析二:基于docker搭建admin调度中心和execut ...
- JAVA使用Logback发送日志到控制台、文件、ELK的最简单用法
一.简述 本文讲JAVA使用Logback发送日志到控制台.文件.ELK的最简单用法. 二.教程 1.新建pom.xml项目引入下列依赖: <dependencies> <!--Be ...
- 【转】Go Interface 源码剖析
源网址:http://legendtkl.com/2017/07/01/golang-interface-implement/ 0.引言 在上一篇文章 <深入理解 Go Interface> ...
- [STF手机设备管理平台]连接其它操作系统上的安卓设备实操介绍
一.背景 看到之前曾有人发贴,贴名[stf 连接各操作系统上安卓设备的操作方法分享],介绍了一下,虽然说方法和理论都有,但下述评论中还是有很多人不知如何操作,特别是不知道stf provider命令如 ...
- JAVA中Integer的==和equals注意
“equals”比较:equals(Object obj)方法,在equals(Object obj)方法中,会先判断参数中的对象obj是否是Integer类型的对象,如果是则判断值是否相同,值相同则 ...
- Redis 为什么使用单进程单线程方式也这么快(转载)
Redis 采用的是基于内存的采用的是单进程单线程模型的 KV 数据库,由 C 语言编写.官方提供的数据是可以达到100000+的 qps.这个数据不比采用单进程多线程的同样基于内存的 KV 数据库 ...
- 面经 cisco 2
1. cpu中的cache结构及cache一致性 一. 引子 在多线程环境中,经常会有一些计数操作,用来统计线上服务的一些qps.平均延时.error等.为了完成这些统计,可以实现一个多线程环境下的计 ...
- npm 发布包和删除包(2019最新攻略)
- golang协程池设计
Why Pool go自从出生就身带“高并发”的标签,其并发编程就是由groutine实现的,因其消耗资源低,性能高效,开发成本低的特性而被广泛应用到各种场景,例如服务端开发中使用的HTTP服务,在g ...