当前位置: 首页 > news >正文

江门市网站建设ip对网站作用

江门市网站建设,ip对网站作用,交易网站开发合同,做网站要会那些psCoreText是一个高效处理字符和字形转换和进行文字排版的框架#xff0c;API基于C语言。 常见的CoreText类介绍 #xff08;1#xff09;、CFAttributedStringRef 属性字符串#xff0c;用于存储需要绘制的文字字符和字符属性 #xff08;2#xff09;、CTFramesetterR… CoreText是一个高效处理字符和字形转换和进行文字排版的框架API基于C语言。 常见的CoreText类介绍 1、CFAttributedStringRef 属性字符串用于存储需要绘制的文字字符和字符属性 2、CTFramesetterRef framesetter对应的类型是 CTFramesetter通过CFAttributedStringRef进行初始化它作为CTFrame对象的生产工厂负责根据path生产对应的CTFrame 3、CTFrame CTFrame是可以通过CTFrameDraw函数直接绘制到context上的当然你可以在绘制之前操作CTFrame中的CTLine进行一些参数的微调 3、CTLine 在CTFrame内部是由多个CTLine来组成的每个CTLine代表一行可以看做Core Text绘制中的一行的对象 通过它可以获得当前行的line ascent,line descent ,line leading,还可以获得Line下的所有Glyph Runs 4、CTRun 或者叫做 Glyph Run每个CTLine又是由多个CTRun组成的每个CTRun代表一组显示风格一致的文本是一组共享想相同attributes属性的字形的集合体 渲染流程 当我们需要排版时可以对字符串设置各种格式生成NSAttributeString然后用NSAttributeString去创建CTFramesetter类CTFramesetter会处理排版信息然后生成排版后的结果CTFrameCTFrame是一段或者多段文本每段文本又由多行文字组成每行的表示为CTLineCTLine是一行文本每行文本由多个CTRun组成CTRun是一小段连续的字形CTTypeSetter负责上下文相关排版处理比如说换行每个CTFrame中都会有一个CTTypeSetter 他们之间的关系图如下 总的来说CTFramesetter是生成CTFrame的工厂类初始化参数是attributed string会在内部创建CTTypesetter并进行实际的排版 CTLine类似每一行的文字CTRun是一行中具有相同属性的连续字形比如说“我正在分享阅读器”就会由三个CTRun组成分别是“我正在”、“分享”、“阅读器”因为“分享”两个字加粗了否则就会是一个CTRun。 CoreText的使用流程 使用core text就是有一个要显示的string然后定义这个string每个部分的样式生成富文本attributedString由富文本生成 CTFramesetterCTFramesetter得到CTFrame使用绘制CTFrameDrawCTFrame  关键函数介绍 由富文本字符串得到CTFramesetter CTFramesetterCreateWithAttributedString(att as CFAttributedString) CFAttributedString是NSAttributedString的CF对象可以直接强转 CTFramesetterRef CTFramesetterCreateWithAttributedString( CFAttributedStringRef string ); CTFramesetter包含了富文本字符串的布局信息和相关属性供后续的绘制操作使用。最主要的作用就是生成下面的CTFrame。 通过调用 CTFramesetterCreateWithAttributedString 函数可以将富文本字符串转换为 Core Text 的布局对象为后续的绘制操作提供所需的文本排版和属性信息。这样你就可以使用 Core Text 提供的更多功能来自定义文本的布局、字体、颜色等并实现高度定制化的文本渲染效果。 CTFramesetterRef 对象并不直接进行绘制操作它只包含了文本布局的信息。要将文本绘制到图形上下文中还需要使用 CTFrameDraw 函数创建并绘制 CTFrameRef 对象。 生成CTFrame CTFramesetterCreateFrame(framesetter, CFRangeMake(pageStart, 0), path, nil) 使用 CTFramesetterRef 对象、文本范围、路径和其他参数创建一个 CTFrameRef 对象 CTFrame是排版数据可直接通过重写View的drawRect方法渲染到页面上 framesetter上面创建的CTFramesetterRefstringRange要使用的文本范围即 CFRange 结构体。 可以通过设置 CFRangeMake 参数来确定要使用的富文本字符串的起始位置和长度如果范围的长度部分设置为0比如CFRangeMake(location, 0)则会尽可能的填满CTFrame将继续添加行直到文本或空间用完。path绘制文本的路径即 CGPathRef 类型对象。 路径定义了文本应该在画布上的布局方式和区域。一般传渲染View的bounds即可frameAttributes可选的附加属性字典提供额外的布局控制和属性设置。 计算分页 CTFrameGetVisibleStringRange(frame) CTFrameGetVisibleStringRange 函数的作用是获取给定文本框架CTFrame中可见的文本范围。可见的范围是指在当前文本框架大小和路径下实际可见的文本部分。 返回值 CTFrameGetVisibleStringRange 函数返回一个 CFRange 结构体表示给定文本框架中可见的文本范围。该范围包括起始位置location和长度length信息。 比如原文有1W字当前的frame只能显示200字那么返回的Range就是0,200下一页在从200的基础上进行计算比如第二页算出为200,430在下一页就从430开始计算如此循环就可计算出这1W字需要分多少页并且每页内容的CTFrame都已生成。 通过上面的介绍把这几个函数连起来就是数据准备阶段的核心方法 根据txt内容生成String - 在由String生成富文本- 由富文本生成framesetter根据页面大小计算生成单页的CTFrameCTFrame获取当前Frame有效的文字显示范围下一页的location累加循环计算分页保存得到每页的内容范围和每页的CTFrame func createCTFrame(contentStr: String) {let range NSMakeRange(0, contentStr.count)let att NSMutableAttributedString(string: contentStr)att.addAttribute(.foregroundColor, value: UIColor.lightGray, range: range)att.addAttribute(.font, value: UIFont.systemFont(ofSize: 22), range: range)let framesetter CTFramesetterCreateWithAttributedString(att as CFAttributedString)let path CGPath(rect: self.readView.bounds, transform: nil)var pageStart 0var frameArray: [CTFrame] []var i: Int 0repeat {let frame CTFramesetterCreateFrame(framesetter, CFRangeMake(pageStart, 0), path, nil)let pageRange CTFrameGetVisibleStringRange(frame)let beginIndex contentStr.index(contentStr.startIndex, offsetBy: pageRange.location)let endIndex contentStr.index(beginIndex, offsetBy: pageRange.length)let onePage String(contentStr[beginIndex..endIndex])pageStart pageRange.location pageRange.lengthprint(第\(i)页 ,pageRange, onePage)i1frameArray.append(frame)} while(pageStart contentStr.count )self.frameArray frameArray}渲染方法 CTFrameDraw(frame, ctx) 渲染的核心方法CTFrameDraw 方法的作用是将指定的文本框架对象绘制到图形上下文中实现文本的可视化呈现。 具体做法在继承UIView的子类中重写drawrect方法里面最重要的一行就是CTFrameDraw(frame, ctx)即可完成渲染 /// 绘制 override func draw(_ rect: CGRect) {guard let frame frameRef, let ctx UIGraphicsGetCurrentContext() else {return}ctx.textMatrix CGAffineTransform.identityctx.translateBy(x: 0, y: bounds.size.height)ctx.scaleBy(x: 1.0, y: -1.0)CTFrameDraw(frame, ctx) } 除了 CTFrameDraw 还想要对文本内容有更精细的控制可以使用CTLineDrawCTRunDraw void CTLineDraw(CTLineRef line,CGContextRef context ) void CTRunDraw( CTRunRef run, CGContextRef context,CFRange range )  CTLineDraw 函数绘制的是单行文本需要在CGContext中设置好position在图文混排时可以用到。 CTRunDraw 函数绘制的是单个文本运行YYText使用的渲染方法就是CTRunDraw对于控制特别精细的可以但是CTRun控制渲染。 以下是在学习的过程中找到的资料 CoreText的基础知识了解 CoreText实战讲解手把手教你实现图文、点击高亮、自定义截断功能 - 简书 文字排版入门—— 排版基础、CoreText和图文混排-腾讯云开发者社区-腾讯云 iOS 基于CoreText的排版引擎 - 简书 比较完整的txt阅读器demo iOS .txt 小说阅读器功能开发的 5 个老套路 - 掘金 套路继续 .txt 小说阅读器功能开发 - 掘金 最简版demo 使用coretext计算分页并渲染上面demo的功能多导致核心逻辑淹没在业务代码中找起来麻烦所以做了一个只展示核心原理的最简demo   博客园系列文章 https://www.cnblogs.com/summer-blog/p/6030641.html https://www.cnblogs.com/summer-blog/p/6030885.html https://www.cnblogs.com/summer-blog/p/6044118.html https://www.cnblogs.com/summer-blog/p/6402664.html 比较精细的阅读器思路页面行高重排目前我们还用不到 我在七猫做阅读器——排版篇 从基础的各种CoreText渲染到页面之间切换动画都有独立的demo最后有一个把CoreText渲染页面切换集成在一起的demo  小说阅读器的设计和实现 - 简书 阅读器多种翻页的设计与实现 - 简书  GitHub - loyinglin/LearnCoreText
http://www.pierceye.com/news/193259/

相关文章:

  • 天河区建设网站品牌网站建设小8蝌蚪
  • 深圳市企业网站seo点击软件小程序游戏开发公司
  • 南宁企业网站设计公怎么进wordpress
  • 商务网站建设一万字做视频剪辑接私活的网站
  • 网站开发绪论phpstudy建wordpress
  • 网站建设的基本流程有哪些wordpress产品页布局
  • 写过太原的网站免费漫画大全免费版
  • 毕业设计做系统好还是网站好冠县网站建设公司
  • 网站管理制度建设开发一个网站需要多少时间
  • 高校网站建设说明书微信公众号涨粉 网站
  • 深圳网站建设公司哪里好中国施工企业管理协会官网
  • 网站自动抢注步步高学习机进网站怎么做
  • 带域名的网站打不开深圳网站优化多少钱
  • 中国空间站科幻作文1000字网站建设从化
  • 做网站买一个域名就够了吗cn域名知名网站
  • 社科联网站建设个人网页英文
  • 做房产推广那个网站好网站改版建设原则
  • 网站建设 语言成都app
  • 免费建站的手机app专业做网站设计公司价格
  • 江苏宜兴做网站的电话seo基础培训
  • 企业手机端网站模板下载济南公司建站模板
  • 一般公司做网站多少钱南昌市房产网
  • 惠州网站小程序建设做公司永久免费网站什么好
  • 湖南涟钢建设有限公司网站局网站建设工作总结
  • 家乡ppt模板免费下载网站合肥百姓网网站建设
  • 免费整套ppt模板下载网站东莞建设教育网站
  • 漯河网站建设漯河ps制作个人网站首页
  • 电商网站公司软件开发和软件研发
  • 网站建设浙江公司网站开发运营新人要注意什么
  • 外贸网站模板哪里下载家里电脑可以做网站服务器吗