betway必威手机版 > betway必威手机版登录 > Swift之CoreText排版神器,CoreText知识积累

原标题:Swift之CoreText排版神器,CoreText知识积累

浏览次数:83 时间:2020-03-26

本篇是续上篇 斯威夫特之CoreText排版神器 ,没看上篇底工篇的建议从上篇看起.

必威体育网址 1图表源于网络

必威体育网址 2

上篇我们介绍了NSAttributeString属性字和CoreText的简约利用,以致轻松的图像和文字混排。那节大家选取CoreText来缓慢解决些此外主题材料。

CoreText是叁个进级的对比底层的布局文本和管理字体的能力,CoreText API在OS X v10.5 和 iOS3.2时引进,在OS X 和iOS 境遇下均能够应用。

image.png

先来看一副图

不是专程复杂的要求日常景况下UILabel、UITextView都足以消除,他们是Apple帮我们封装好的显得文本的控件,然而像复杂的图像和文字,链接识别并替换来"点击链接" , @someone 绑定 ,电话甄别,文字大小不一 ,当然那个能够选择UIWebView,可是CoreText 技巧相对于 UIWebView,有着越来越少的内部存款和储蓄器占用,甚至可以在后台渲染的长处,非常切合用于内容的排版职业。CoreText 提供了非常高的圆滑,然而操作起来的相比较复杂,学技能不就应当找最难的打下吗?

CoreText 是用来拍卖文字和字体的平底技艺。它平素和 Core Graphics(又被称得上 Quartz)打交道。Quartz 是多少个 2D 图形渲染引擎,能够管理 OSX 和 iOS 中的图形显示。

必威体育网址 3字形

来看一张框架图

Quartz 能够一贯管理字体(font)和字形(glyphs),将文字渲染到分界面上,它是幼功库中独一能够管理字形的模块。由此,CoreText 为了制版,要求将展现的文本内容、地方、字体、字形直接传送给 Quartz。比较别的 UI 组件,由于 CoreText 直接和 Quartz 来交互作用,所以它富有高效的制版效果。

如图,Origin那块是基线也就是原点,descent是向下的 平时是负值,ascent是正值,还恐怕有lineHeight和capHeight还有x-height都在图中标注,那在代码中如何获取这几个值吗?

必威体育网址 4配图

CoreText使用的优势:

let font = UIFont.systemFontOfSizeprint(font.descender) //-3.376953125print(font.ascender) //13.330078125print(font.lineHeight) //16.70703125print(font.capHeight) //9.8642578125print(font.xHeight) //7.369140625print(font.leading) //0.0

要学习CoreText 首先得询问属性字---NSAttributedString 或者 NSMutableAttributedString

1.api调用更底层,效用更高

此地定义二个14号的文字 抽取相应的顺序值。这么些都以只读的

NSAttributedString是二个包蕴属性的字符串,通过此类能够灵活地操作和表现存余体裁的文字数据

2.能够在后台渲染

纯文本制版的时候会有一对细节难点,我们先来绘制一个包蕴汉语,乌Crane语,数字以致emoji表情的文本看看效果。

能够先行定义好属性 然后加到文字上

3.得以完结复杂的图像和文字混排须要

必威体育网址 5未管理前的绘图

let str = "这是一段用来测试的字符串 this is a string for test"let dic = [NSFontAttributeName:UIFont.boldSystemFontOfSize, NSForegroundColorAttributeName:UIColor.redColor()]let attrStr = NSAttributedString(string: str, attributes: dic)label.attributedText = attrStr

4.渲染速度相比较于uikit 跟 uiwebview越来越快

能够阅览在含有emoji的那几行占有的万丈会相比较高,空隙比相当的大。所以只要按boundingRectWithSize 依照字体大小和幅度来总计文本中度的点子就特别了,何况这么排版看起来亦不是很雅观,那样我们就无法向来用CTFrameDraw来绘制了,或然须要给定行高,一行一行绘制 ,使用CTLineDraw

效果

缺点:

率先大家供给总括出文字所占的Size.

必威体育网址 6配图

1.基于c的api对于ios开采者不是很友好

let SCREEN_WIDTH:CGFloat = UIScreen.mainScreen().bounds.size.width //屏幕宽度 /** 计算Size - parameter txt: 文本 - returns: size */ func sizeForText(mutableAttrStr:NSMutableAttributedString)->CGSize{ //创建CTFramesetterRef实例 let frameSetter = CTFramesetterCreateWithAttributedString(mutableAttrStr) // 获得要绘制区域的高度 let restrictSize = CGSizeMake(SCREEN_WIDTH-20, CGFloat.max) let coreTextSize = CTFramesetterSuggestFrameSizeWithConstraints(frameSetter, CFRangeMake , nil, restrictSize, nil) return coreTextSize }

能够见见我们并不曾给label设置颜色和字体,创立了四个带两特特性的NSAttributedString , 没有行使label.text而是 label.attributedText

2.内部存款和储蓄器需求和睦去决定,轻松现身内部存款和储蓄器走漏

非常轻巧 ,依照属性字得到framesetter 然后再依靠framesetter计算出所占的size。

假如必须要给具有的文字设置同一的天性,那那些属性字也太单调了。大家得以给一段文字设置不一样的习性

下图是 CoreText 的布局图,能够看来,CoreText 处于非常底层的岗位,上层的 UI 控件(包含 UILabel,UITextField 甚至 UITextView)和 UIWebView 都以基于 CoreText 来促成的。

公海赌5500www ,得到size后要怎么操作呢?

let mutableAttrStr = NSMutableAttributedString(string: str)mutableAttrStr.addAttributes(dic, range: NSMakeRangemutableAttrStr.addAttributes([NSFontAttributeName:UIFont.systemFontOfSize,NSUnderlineStyleAttributeName: 1 ], range: NSMakeRangelabel.attributedText = mutableAttrStr

CTRun

那块笔者贴下全部代码 注释很详细

大家得以给区别地点的文字内定分歧的体制,地点通过NSRange给出(NSRange是一个构造体,有多个参数 三个location 叁个 length ,那五个参数能够独一的规定一段字串State of Qatar

必威体育网址 7

import UIKitclass CTextView: UIView { let SCREEN_WIDTH:CGFloat = UIScreen.mainScreen().bounds.size.width //屏幕宽度 let SCREEN_HEIGHT:CGFloat = UIScreen.mainScreen().bounds.size.height //屏幕高度 override func drawRect(rect: CGRect) { super.drawRect // 1 获取上下文 let context = UIGraphicsGetCurrentContext() // 2 转换坐标 CGContextSetTextMatrix(context, CGAffineTransformIdentity) CGContextTranslateCTM(context, 0, self.bounds.size.height) CGContextScaleCTM(context, 1.0, -1.0) // 3 绘制区域 let path = UIBezierPath(rect: rect) // 4 创建需要绘制的文字 let attrString = "来一段数字,文本emoji的哈哈哈29993002-309-sdflslsfl是电话费卡刷卡来这来一段数字,文本emoji的哈哈哈29993002-309-sdflslsfl是电话费卡刷卡来这来一段数字,文本emoji的哈哈哈29993002-309-sdflslsfl是电话费卡刷卡来这来一段数字,文本emoji的哈哈哈29993002-309-兰emoji 
		

本文由betway必威手机版发布于betway必威手机版登录,转载请注明出处:Swift之CoreText排版神器,CoreText知识积累

关键词: 神器 Swift CoreText 长篇 Swi

上一篇:屏幕适配

下一篇:没有了