本文通过 3 个比如,继续叙述 Core Text 实践上的思路
前文现已完结了操控每个字的方位,
Core Text 实践:自定义每个字的方位
一个格子,一个字
一个字,一个富文本,一个 CTLine,
先画背景图,再画文字,即可
比如一,在前文的基础上,完结主动换行
将原本的两行 “椿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..<php钱银;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下载,都有适合的间距
从整个的富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
每一个字符,都增加边框
分为两类
- 一行字符,都增加边框
都给画了,每一个字符的边框, 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
, 疏忽掉榜首个字符的边框