结束下面的作用

Core Text 实践 +:文字随心所欲摆放

能够运用很多控件,

左面红框内,一个 UILabel;

右边红框内,一个 UILabel

很多个 UILabel 码起来


运用 CoreText 能够用一个控件,结束制作

思路:

先把原文,转化为下面的

Core Text 实践 +:文字随心所欲摆放

再把第二element滑板张,转化为最初的作用


先要弄出一个类似结构的富文本

确保element是什么牌子每一行的 Y 坐标,可控

( 确保非右边红框的内容,与毕竟一同)

( 确保右边红框的内容,其行数和 y 坐标,与毕竟一同)

  • 富文本github中文官网网页,转化为 CTFrame 一, 呈现第二张图,( 把右边红框内的文本,处理掉 )

关键是,把右边红框内的富apple文本,合理拆分出来

CTFrame 一,宽度 = 右边红框内的富文本的宽度 + 50

  • 右边红框富文本,转化为 CTFrame 二 , 糊到上一步空出的当github下载

右边红appointment框内的文字,天然不能用 CTFrame 一

一个右边的红框,便是一个 CTFrame 二

给一个字符串,app装置下载怎样知道它有多少行

字符串,转化为富文本,

富文本,转化为 CTLine,

拿到 CTLine 的宽度 lineWidth,

知道文本框的宽度 containerWidth,

行数 = Int(github中文社区ceil(lineWidth / containerWidth))

结束:

比如数据

[
{
"string" : "国际が終るまでは",
"type" : 6
},
{
"strinapplicationg" : "国际が終わる前に 聞かせておくれよ",
"title" : "歌詞:"appreciate,
"type" : 7
},
{
"string" : "在国际止境之前appearance告诉我",
"title" : "注釈:",
"type" : 8
},
{
"string" : "国际が終わるまでは 離れる事もない  .  そう願ってた 幾千の夜と  .  戻らない時だけが 何以輝いては",
"title" : "歌詞:",
"type" : 7
},
{
"striElementng" : "我appearance要走到国际止境 . 我希Element望数不胜数的夜晚 . 为什么只在github永久回家地址不回来时才闪烁",
"title" : "注釈:",
"type" : 8
}
]

git教程化为

用于右边红框内的占位,和非右边红框区域的烘托GitHub

  • 右边红框内的appear占位

拆分技术,前面有写

从内容 string,拆分出 subList


▿ 0 : Coupling
- string : "国际が終るまでは"
-github直播渠道永久回家 type : 6
▿ 1 : Coupling
- string : "国际が終わる前に 聞かせておくれよ"
- type : 7
▿ title : Optionalgithub<String>
- some : "歌詞:"
▿ subLelement滑板ist : Optional<Array<String>>   // 用于占位, 一个字符串,拆出了两行
▿ some : 2 elements
- 0 : "ha ha ha"
- 1 : "ha ha ha"
▿ 2 : Coupling
- string :element滑板 "在国际止境之前告诉我"
- type : 102
▿ title : Optional<String>
- some : "注釈:"
▿ 3 : Coupling
- string : "国际が終わるまでは 離れる事もない  .  そう願ってた 幾千の夜と  .  戻らない時だけが 何以輝いては"
- type : 7
▿ title : Optional<String>
- some : "歌詞:"
▿ subList : Optional&ltGit;Array<String>>  // 用于占位, 一个字符串,拆出了3行
▿elementary怎么读音 some : 3 elements
- 0 : "ha ha haapprove"
- 1 : "ha ha ha"
- 2 : "ha ha ha"
▿ 4 : Coupling
- string : "我要走到国际止境 . 我期望数不胜数的夜晚 . 为什么只在不回来时才闪gitee烁"
- type : 8
▿ title : Optional<appreciateString>
- some : "注釈:"
▿ subLgithub官网ist : Optional<Array<String>>  // 用于占位, 一个字符串,拆出了3行
▿ some : 3 elements
- 0 : "ha ha ha"
- 1 : "ha ha ha"
- 2 : "ha ha ha"

和红框内制作信息


struct Rendereapp装置下载r{
// 红框内,每一段的制作信息
let paragraph: [ParagraphRendelement滑板erer]
}
struct ParagraphRenderer{
// 对应实践制作的初步行
let lineIgithub怎么下载文件dx: Int
// 右边红框对应的文本
leelementtypet content: String
// 右边红框对应的行数
let cgithub中文社区nt: Int
// 左github打不开框对应的文本
let t: String
// 确认款式
lgithubet beBlack: Bool
// 右边红框用于制作的信息
var lines = [CTLine]()
}

模型核算部分,见底部 github repo

核算思路,可参阅之前的博客,见底部

制作

        //        y 坐标操控
// Core Text 坐标,原点在左下,
// 先对 UIKit 坐标系翻转,
// lastY, 是行距的累计
var lastY: CGFloat = 0
var index = 0
let limit = info.paragraph.count
// 阶段初步行距的记载
var startIndex: Int? = nil
for (i,line) in lines.enumerated(){
var lineAscent:CGFloat      = 0
var lineDescent:CGFloat     = 0
var lineLeading:CGFloat     = 0
CTLineGetTypographicBounds(line , &linelement滑板eAscent, &lineDescent, &lineLeading)
var lineOrigin = originsArray[i]
lineOrigin.x = TextContentgitlabConst.pagithub中文官网网页dding + lineOrigin.x
// ...
// y 坐标操控
let yOffset = lineOrigin.y - lineDgithub直播渠道永久回家escent - 20
if i == info.lineIndex{
ctx.draw(line: yOffsetgithub下载)
}
ctx.textgithub打不开Position = lineOrigin
// 制作记载,
// 假如制作了红框内的内容,
// 就不要制github直播渠道永久回家造 CTFrame 一 的内容了
var toDraw = false
// 持续处理阶段的剩下行
if letElement f = startIndex{appointment
if i >element是什么牌子= f{
// 阶段画完了
startIndex = nil
}
elsgithub中文官网网页e{
//  制作阶段的剩下行
let biscuit = info.paragraph[index - 1]
ctx.textPosition = CGPgithub官网oint(x: lineOrigin.x + TextContentConst.indentSecond, y: lineOrigin.y)github敞开私库
//  stargithub敞开私库tIndegitix = i + biscelementsuit.cnt 的机会,
//  biscuit.cnt + i - f = 初始行
// i 增加,对应阶段的剩下行
CTLineDraw(biscuit.lines[biscuit.cnt - (f - i)], ctx)
toDraw = true
}
}
// 逻辑的进口,
// 找到了榜首段的榜首行
if index < limit,appreciate info.paelementaryragraph[index].lineIdx == i{appreciate
let biscuitappstore = info.paragraph[index]
// 左面红框的信息
let attributedStr: NSAttributedString = biscuit.t.seven(toBreak: false)
let ln = CTLineCreatgithub直播渠道永久回家eWithAttribuGittedString(attributedStr)
// 画左面红框
CTLineDraw(ln, ctx)
ctx.textPosition = CGPoint(x: lineOrigin.x + TextContentConst.indentSecond, y: lineOrigin.y)
// 画右边红框的榜首行
CTLineDraw(biscuit.lines[elementanimation0], ctx)
toDraw = true
startIndex = i + biscuit.cnt
index += 1
}
if toDraw == false{
CTLineDrawgithub中文社区(line, ctx)
}
}
模型优化

case 7:   // 只是一个记号
// ...
let attributedStr = NSAttributedString()
let lnTwo = CTLineCreateWithAttributedString(attributedStr)approach
let w = lnTapplicationwogithub中文官网网页.lnSize.width
let cnt = w / TextContentConst.widthBritGitain
var m = model
let len = Int(ceil(cnt))
if len > 1{
// 右边红框超过一行,放在 Frame 2
(1..<len).forEach {
acht.append($0 + enLineIdx)
}
m.subList = [String](repeating: product, count: len)
infoEn.append(ParagraphRenderGitHuber(lineIdx: enLineIdx, content: model.string, cnelementuit: len, t: m.title ?? "", beBlack: true))
}
else{
// 右边红框等于一行,放在 Frameapprove 1 中
m.type = 101github中文社区   // 只是一个记号
}
info.append(m)
enLineIdx += len

往期博客:

Core Text 实践 +:主动换行,与字等级的控github中文官网网页

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

gitgiteehub repo