为什么要用CoreText(富文本)来取代WebView去显示内容。
主要的原因就WebView有很大的问题,性能,FPS,卡顿,与原生不搭。这些都是大问题。

WebView的缺点

1.直接使用WebView等于是是把某一个页面纯粹当成了Web页面进行渲染,这样的情况被称为“非原生”,不仅会失去渲染速度和交互体验,当一个页面上既有服务器传回的HTML与CSS样式又有原生的UI控件时,UIWebView就会变得特别不好处理,与其他UI控件间的通信也显得很不协调。

2 . WebView是单线程模型,所有的图片的加载只能在主线程上执行,还有是脚本语言的动画,也是考量因素。

3.渲染 WebView不是根据可视范围决定每次的渲染范围,而是根据自身控件的frame大小决定。尝试webview嵌在tableview里,为了让webview跟tableview一起滚动,把webview的大小设为webview里的内容大小,让webview不出滚动条,从而能跟着tableview的滚动条一起滚。这样做的后果是每次webview都一次性渲染整个页面,内存占用多性能很差,而且在放大缩小这个webview时,渲染放大的整个页面更吃力,出现不能忍受的性能。解决办法是让webview定住高度为一整屏iphone的高度,限制了webview每次的渲染范围为可视范围,性能大好。带来的问题是无法随tableview滚动。

4.UIWebView用的是脚本语言,需要逐句解析出来,然而DOM/CSS 排版复杂,在渲染上需要大量计算,才能加载到视图上,和OC在运行时去编译相比起来,脚本语言缺乏效率,而且WebView还能渲染doc,pdf,ppt这样的文件格式,这么一个强大的控件对资源的占用可想而知。UIWebView 笨重难用又不是一天两天了,还有很严重的内存泄漏。

 
setTimeout/setInterval

最早做动画都是用 setTimeout/setInterval。
而 setTimeout/setInterval 的处理回调的时间 tick time 精度都在 16ms 左右。
所以,可以想象正常用这两个函数就已经 16 ms了,再加 reflow/repaint/compositing 卡顿或跳帧就是家常便饭了。

CoreText的趋势:

富文本CoreText 占用的内存更少,渲染速度快,可以在后台线程渲染。而 WebView 的内容只能在主线程渲染。基于 CoreText 可以做更细腻的原生交互效果。而 WebView 的交互效果都是用 JavaScript 来实现的,一个简单的按钮按下效果都会有一定程度的卡顿。这也使得新浪微博等主流 App 都放弃使用这种方案。追求卓越流畅度的公司,都开始使用CoreText来取代WebView。

实现思路

把Html+Css字符串直接由服务器传到本地,调用iOS/OS X底层的渲染引擎CoreText去进行渲染。换句话说,这种渲染方式是轻量级的,它去掉了许多Web渲染的繁杂步骤和功能,直接根据Html+Css去渲染图片、文字的样式。当然,根据你的需求,你也可以决定是否处理超链接和显示视频等。此时就有一个很牛逼的类。DTCoreText

解析HTML的相关类,为什么我选择了DTCoreText?

TFHpple- TFHpple 解析html的轻量级框架

RTLabel- RTLabel 基于UILabel类的拓展,能够支持Html标记的富文本显示,它是基于Core Text,因此也支持Core Text上的一些东西

Ono- A sensible way to deal with XML & HTML for iOS & OS X

SwiftyXMLParer- Simple XML Parser implemented in Swift

HTMLKit- An Objective-C framework for your everyday HTML needs.

DTCoreText- 来自澳洲的Oliver Drobnik,秉着开源和分享的精神,为我们提供了完美的框架—DTCoreText。可以解析HTML与CSS最终用CoreText绘制出来,通常用于在一些需要显示富文本的场景下代替低性能的UIWebView。

DT优点太多

DT优点太多,我只说一个原因,DTCoreText从2011年开始发布到GitHub上,一直没有间断过更新,就今天2016年9月4日,Drobnik本人又把DTCoreText更新了一个版本,修复了bug。这个代码一直都还活着,可能很粗糙,没有很好的缓存,可能有一些用的还是老一套的东西,但是这个作者一直没离开这个圈子,DTCoreText依旧充满活力。在我读DTCoreText源码的时候,我明显感到YY大神是看过这套源码的。能从YYLabel的字里行间,包括附件啊,这一套,可能都是跟DTCoreText学习的。

DT的缺点也挺多
1.解析速度虽然很快,但是如果这个HTML的图片量很大的时候,卡顿会非常严重。
2.存在内存泄露,pop出来的时候,内存也不会马上归位,逐渐降低,但是最终还是有内存泄露的情况。
3.JS代码交互不能够使用。
4.相关的资料太少。

作者:DoubleShawn
链接:https://www.jianshu.com/p/6f8162537975
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

HTML的CoreText流畅度超过WebView。CoreText第三方框架DTCoreText的介绍的更多相关文章

  1. iOS如何提高页面流畅度

    A.提高CPU性能 对象创建1.尽量用轻量的对象代替重量的对象,比如CALayer 比 UIView 要轻量许多,如果不考虑交互事件的话,可以选择CALayer.2.Storyboard和xib加载对 ...

  2. Android流畅度测试

    Android流畅度测试 测试方法一:系统自带-开发者模式 测试方法二:FPS Meter测试安卓帧数 H5页面加载速度:window.performance.timing 测试方法一:系统自带-开发 ...

  3. [原] Android持续优化 - 提高流畅度

    一.形象的感官一下流畅度概念 1. 这是官方给出的概念:Android流畅运行,需要运行60帧/秒, 则需要每帧的处理时间不超过16ms. 2. 每秒帧数,实际上就是指动画或视频每秒放映的画面数.因此 ...

  4. Android App性能评测分析-流畅度篇

    1.前言 在手机App竞争越来越激烈的今天,Android App的各项性能特别是流畅度不如IOS,安卓基于java虚拟机运行,触控响应的延迟和卡顿比IOS系统严重得多.一些下拉上滑.双指缩放快速打字 ...

  5. 流媒体技术学习笔记之(七)进阶教程OBS参数与清晰度流畅度的关系

    源码地址:https://github.com/Tinywan/PHP_Experience 很多主播问过OBS的参数到底什么影响画质,到底什么影响流畅度,那么本篇教程尽量用通俗的语言解释下一些重要参 ...

  6. app流畅度测试--使用手机自带功能

    1.进入开发者选项,在“监控”选项卡找到“GPU呈现模式分析”的选项 2.开启后,即可以条形图和线形图的方式显示系统的界面相应速度 3.那么要如何根据曲线判断系统是否流畅呢?实际上这个曲线表达的是GP ...

  7. 专项测试实战 | 如何测试 App 流畅度(基于 FPS 和丢帧率)

    本文为霍格沃兹测试学院学员学习笔记. FPS 和丢帧率可以在一定程度上作为 APP 流畅度的一项衡量标准,本文介绍利用 adb shell dumpsys gfxinfo 命令获取软件渲染加载过程的数 ...

  8. iOS开发之多种Cell高度自适应实现方案的UI流畅度分析

    本篇博客的主题是关于UI操作流畅度优化的一篇博客,我们以TableView中填充多个根据内容自适应高度的Cell来作为本篇博客的使用场景.当然Cell高度的自适应网上的解决方案是铺天盖地呢,今天我们的 ...

  9. 腾讯GT的流畅度测试方案研究

    GT源码:https://github.com/TencentOpen/GT 一.流畅度模块的代码结构 流畅度插件总共就几个类,其实处理方式也比较简单粗暴,就是通过Choreographer输出的lo ...

随机推荐

  1. del

    Before writing it I spent a fair amount of time on reviewing our chat-log. How silly. asljdfajsodfss ...

  2. g2o error

    /home/lzp/slamtest/graduationcode/p3/poseestimation/pose_estimation_3d2d.cpp: In function ‘void bund ...

  3. 撩课-Java每天5道面试题第9天

    撩课Java+系统架构 视频 点击开始学习 76.XML技术的作用? XML技术用于数据存储. 信息配置. 数据交换三方面. 可以将数据存储在XML中, 通过节点. 元素内容. 属性标示数据内容及关系 ...

  4. hdu 4190 Distributing Ballot Boxes 二分

    Distributing Ballot Boxes Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  5. delphi之读写文件的三种方式

    一.Tstrings.Tstringlist procedure TForm1.Button2Click(Sender: TObject); var strlist: TStringList; pat ...

  6. BZOJ1149 [CTSC2007]风玲

    Description Input Output 输出仅包含一个整数.表示最少需要多少次交换能使风铃满足Ike的条件.如果不可能满足,输出-1. Sample Input 6 2 3 -1 4 5 6 ...

  7. Django之Form字段插件

    一.Django内置Form组件:        在使用Django内置的Form组件时,里面包含了许多[字段]和[插件],也就是验证用户输入的请求以及生成显示在前端的HTML.下面介绍一下用法: F ...

  8. mybatis大框架

    MyBatis   开源的数据持久化层框架 实体类与SQL语句之间建立映射关系 一:MyBatis前身是IBatis,本是Apache的一个开源的项目, 基于SQL语法,简单易学 ,是耦合度降低,方便 ...

  9. redhat系统下三种主要的软件包安装方法

    1. 通过RPM软件包来安装 RPM(Redhat Package Management)标准的软件包,只需简单地输入命令“rpm -ivh filename.rpm”即可: 如果需要对已经安装的RP ...

  10. MySQL 常用语句大全

    MySQL 常用语句大全 一.连接 MySQL 格式: mysql -h 主机地址 -u 用户名 -p 用户密码 1.例 1:连接到本机上的 MYSQL. 首先在打开 DOS 窗口,然后进入目录 my ...