为什么要用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. .net mvc 获取acion 返回类型

    1..net core 中获取 public override void OnActionExecuted(ActionExecutedContext context) { var descripto ...

  2. [javaSE] 基本数据类型对象包装类

    按照java面向对象的原则,每个基本类型都有对应的包装类 byte Byte short Short int Integer long Long boolean Boolean float Float ...

  3. [javaSE] 多线程通信(等待-唤醒机制)

    两个线程操作同一个资源,比如,输入和输出,操作同一个对象,此时两个线程会争夺cpu的执行权,随机的进行切换.我们想实现先输入再输出,顺序的执行 目标对象定义一个标记字段,进行判断,wait()和not ...

  4. 九、sparkStream的scala示例

    简介 sparkStream官网:http://spark.apache.org/docs/latest/streaming-programming-guide.html#overview spark ...

  5. 【转载】Spring Cloud底层原理

    概述 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术.不过大多数讲解还停留在对Spring Cloud功能使用的层面,其底层的很多原理,很多人可能并不知晓 ...

  6. Java基础——封装类

    封装类的由来: 为了将基本类型以对象行使存在,java对八个基本类型提供了引用类型,这八个引用类型称为基本类型的“包装类”. 八个基本类型对应的封装类: int           --->   ...

  7. rocketmq 控制台 trackType NOT_CONSUME_YET

    1. 问题描述 rocketmq消费者偶有没有收到消息,查看后台, 显示NOT_CONSUME_YET 2. 分析 mq控制台 显示有该条消息数据 只是状态为未消费 那么问题应该出在 消费者一方 诶? ...

  8. POJ P2777 Count Color——线段树状态压缩

    Description Chosen Problem Solving and Program design as an optional course, you are required to sol ...

  9. Designers, please follow the guidelines

    Skype released big update for its iOS application last week. It brought in a major overhaul of not o ...

  10. 前端动画小记---bilibili ( ゜-゜)つロ客户下载小动画

    逛哔哩哔哩 ( ゜-゜)つロPC版的时候看到一个蛮有意思的动画,指导用户去下载客户端,于是摸索实现了一个. 原动画效果 可以看到,一个静止的小电视人,当鼠标移动到电视人身上时,电视人慢慢变身成为一个小 ...