本文通过 3 个比如,继续叙述 Core Text 实践上的思路

前文现已完结了操控每个字的方位,

Core Text 实践 +:主动换行,与字等级的操控

Core Text 实践:自定义每个字的方位

一个格子,一个字

一个字,一个富文本,一个 CTLine,

先画背景图,再画文字,即可

比如一,在前文的基础上,完结主动换行

Core Text 实践 +:主动换行,与字等级的操控

将原本的两行 “椿n赤い椿”,

转换为一行 “椿 赤い椿”,

剩余的,就简略了

把每个字,转化为格子approve

遇到空格,就跳过

模型处理

模型长这样php钱银

struct Coupligiting: Decodabgit教程le {
var string: Strphpmyadmining
let type: Int
}

数据是这样一个 lisapp安装下载t, [Coupling]

现在要做兼并,

可以放在一github永久回家地址行,就放在一行,

不可以放在一行,就换行

数据款式: 标题 , 许多格子,标题,github敞开私库其他(略)

        // 这个是 result
var igithub敞开私库nfo = [Coupling]()
// 放置当时的文本
var current: Coupling?
for jujube in list{
switch jujuapprovebe.type{
case 4:
// 格子
/GitHub/ 拿到当时的github官网格子,看情况
if var c = current{
// 拼接当时和下一个,看看作用
letappreciate reduceTmp = c.string + " " + jujube.string
// 跨越一行
if reduceTmp.fouphp文件用什么软件打开rW >= TextContentConst.widthInUse{
//php面试 就增加当时
info.append(c)
// 更新当时文本
current = jujube
}
else{
// 不跨越一行,就运用增加过的
c.string = reducgithub是干什么的eTmp
current = c
}
}
else{
// 进入一组appearance格子时,取榜首个
current = jujube
}
dappearefault:
// 标题
if let c = current{
info.append(c)
current = nil
}
info.append(jujube)
}
}
// 补余
// 终究的几个,可能不跨越一行
if let cphp中文网 = current{
info.append(c)
}
rephp是什么ndappearerGrid = info

这样,文本就转化好了

制作部分

func drawGrigithub中文社区ps(m iGitnfo: TxtRenderInfo, lnH lnHeight: CGFlogithub永久回家地址aapproacht, index i: Int, dB startIdx: Int, lineOrigin lnOrigin: CGPoint, context ctx: CGContext, lnAscent lineAscent: CGFloat) -&gphp是前端仍是后端t; CGFloat{php7
// 拿到当时这一句
let content = info.strs[i - sapproachtartIdx]
let glyphCount = content.count
var frameImg = TextContentConst.fBgTypoImg
let lnOffPHPsset = (TextContentCgithub敞开私库onst.padding - lnHephpmyadminight) * 0.5
var lineOrigin = lnOrigin
lineOrigin.y -= lnOffsset
var textP = lineOrigin
// 处理每一个字
for idx in 0..&ltphp钱银;glyphCoappearanceunt{
// 一个字,一个 CTLine
let pieX = String(content[idx])
let ln = CTLineCreateWithAttributedString(pieX.word)
let lnSize = ln.lngiti轮胎是什么品牌Size
let typeOriginX = TextCongitlabtentConst.padding * CGFloat(idx + 1)
// 文本的原点 x 值 = 图片原点 x 值 + 偏移GitHub
textP.x = typeOriginX + (TextContentConst.padding - lnSize.width) * 0.5
ctx.textPositigithub打不开on = textP
// 背景图的 frame
frameImg.origin.x = typphp面试题eOriginX
fraappointmentmeImg.origin.y = lineOriapproachgin.y + lineAscent - TextContentConst.fBgTypoImg.size.height + TextContentConst.offsetP.y
igit教程f pieX != "php是什么 "{
// 不是空格
//approach 制作背景图
bgGrip?.draw(in: frameImg)
//php是前端仍是后端 制作文本
CTLinphp是什么eDraw(ln, ctx)
}
}
return lnOffsset
}

github repappreciateo

比如 2, 字等级的操控 A

每一行github下载,都有适合的间距

Core Text 实践 +:主动换行,与字等级的操控

从整个的富github直播渠道永久回家文本,到 CTFrame,

从 CTFrame,拆出 CTLine,

一部分 CTLine,拆出 CTappointmentRun ( 就是左边格子,右边一行文本 )

只能拿到行号

得到的数据如下: 作用比较丰富

拼音间隔格子,8 pt

格子 + 文本

一行php钱银文本,都是格子

上面的规则,应用到那些 CTLine,

需求树立一个映射 map,

把 CTLine 的行号,对应的格式记录下来

        // 拼音间隔格子,8 pt
var pronounceY = [Int]Git()
// 格子 + 文本, 带拼音
var pairs = [Int]()
// 格子 + 文本, 不带拼github音
var wArr = [Int]()
// 一整行格子列表的,内容
var sgithub中文官网网页trs = [String]()
lgithub敞开私库et cnt = list.count
// 关于每一段内容
var i = 0
// 关于每一个行
var index = 0
// 一整行格子列表的,初始行号
var startIdx: Int? = nil
while i < cnt {
let ri = list[i]
switch ri.type {
case 1:
// 格子 + 文本, 带拼音
// 占有两行
index += 2
pronounceY.append(index)
case 3:
// 格子 + 文本, 不带拼音
inphp是前端仍是后端dex += 1
wArr.append(index)
case 4:
// 一整行格子列表
index += 1github下载
if startIdx == nil{
startIdx = iapplicationndex
}
pairs.append(index)
strsgithub怎么下载文件.append(ri.string)
default:
// 拼音部分
index += 1
}
i += 1
}

行号 index, 先 + 1 / + 2, 再增加

因为前面还有一个 title, title 和 bgiteeodgiti轮胎是什么品牌y 是分隔的,

制作部分APP
                ctx.textPosition = lineOrigin
if info.contains(pair: i){
// 制作格子 + 文本, 带拼音,
// 还有,制作格子 + 文本, 不带拼音
drawPairs(context: ctx, ln: line, startPoint: lineOrigin, ascent: lineAscent)
}
else iappointmentf info.phraseYgithub永久回家地址.contains(i), let startIdx = info.startIdx{
// 制作一整行格子列表
let lnHeight = lineAscent + lineDesgithub是干什么的cent + lineLeaGitding
lastYphp钱银 -= drawGrips(m: info, lnH: lnphp是什么Hegithub直播渠道永久回家ightgithub敞开私库, index: i, dB: startIdx, lineGitOrigin: lineOrigin, context: ctx, lnAscent: lineAscent)
}
else{
// 制作拼音
CTLineDraw(line, ctx)
}

github repo

比如 3, 字等级的操控 B

每一个字符,都增加边框

Core Text 实践 +:主动换行,与字等级的操控

分为两类

  • 一行字符,都增加边框

都给画了,每一个字符的边框, shallOmit = true

从每一个 CTLine, 获取其一切的 CTRun,

拿到 CTRun 的一切的字形 glyph,github敞开私库

字形 glyph 的边框方位,是这一行的开始方位 lineOrigin + 这个字在这一行中的方位 point + 这个字自身的方位 box.origin

     func drawBorders(context ctx: CGContext, ln line: CTLine, lnOrigin lineOrigin: CGPoint, omit shallOmit: Bool = true){
ctx.setStrokeColor(UIColor.green.withAlphaComponent(0.6).cgColor)
var notOmit = shallOmit
// line 中每个 CTgithub是干什么的Run
for run in line.glyphRuns{
if notOmit{
let font = run.font
let glyphPositions = run.glyphPositions
let glyphs = run.glyphs
let glyphsBoundingRects = font.boundingapproveRects(of: glyphs)
// CTRun 中每个 glygithub下载ph
for k in 0.github打不开.<glyphPositions.count {
let point = glyphPositions[k]
var box = glyphsphp7Bogit教程undingRects[k]
box.origin = box.origin + point + lineOrigin
ctx.stroke(bgitlabox)
}// for k
}
notOmit = true
}//fogit教程r run
}
  • 格子 + 一行字

右边的一行字,都增加边框

shallOmappearanceit = false , 疏忽掉榜首个字符的边框

github repo