iOS UILabel核心文本行数
我想创建UILabel的自定义子类,它将知道当前显示的行数。据我所知,UILabel在更改iOS UILabel核心文本行数,ios,uilabel,nsattributedstring,core-text,Ios,Uilabel,Nsattributedstring,Core Text,我想创建UILabel的自定义子类,它将知道当前显示的行数。据我所知,UILabel在更改text或font时会自动更改其attributedText属性。所以我试着这样做: label.text=“一些很长的文本” label.font=.systemFont(ofSize:12) guard let attrStr=label.attributedText-else{ 返回 } 打印(属性行(装配宽度:600).计数) ... 扩展NSAttribute字符串{ func行(fittingW
text
或font
时会自动更改其attributedText
属性。所以我试着这样做:
label.text=“一些很长的文本”
label.font=.systemFont(ofSize:12)
guard let attrStr=label.attributedText-else{
返回
}
打印(属性行(装配宽度:600).计数)
...
扩展NSAttribute字符串{
func行(fittingWidth:CGFloat)->[字符串]{
让attributedString=self
让制框工=
CTFramesetterCreateWithAttributedString(
属性字符串
)
让path=CGPath(rect:CGRect(
x:0,,
y:0,
宽度:宽度,
高度:。最大有限高度
),transform:nil)
设frame=CTFramesetterCreateFrame(
框架制定者,
CFRange(位置:0,长度:0),
路径
无
)
让lines=CTFrameGetLines(帧)作为![CTLine]
var strLines=[String]()
让nsString=attributedString.string作为nsString
排队{
让lineRange=CTLineGetStringRange(直线)
let range=NSMakeRange(lineRange.location,lineRange.length)
strLines.append(nsString.substring(带:range))
}
返回斯特林
}
}
但问题是,当我使用标签的
attributedText
值时,行(fittingWidth:)
对于任何配件宽度总是只返回一行。在我自己构造NSAttributedString
的同时(通过使用text
和font
属性)行(fittingWidth:)
返回正确的行数。内置的attributeText
value有什么问题?我肯定看到了CTFrameGetLines()
的一些怪癖。您是否需要处理可能具有复杂的属性文本的标签?如中所示,多个大小和段落属性的多个字体?或者只是简单的-本质上是“纯文本”-标签?@DonMag,大多数情况下,我会使用单字体的“纯文本”标签,因此从text
和font
属性生成nsattributestring
是可以接受的。但我只是想让我的代码具有通用性,能够处理“多种大小的多种字体和段落属性”。好吧,通过一些快速测试,它看起来更复杂。我找到了一种从纯文本UILabel
中“自动”转换的方法,以获得准确的行数。。。如果您在标签中设置了.attributedText
(与设置.text
相反),CTFrameGetLines
是可靠的,除非标签中有多个字体/大小。您可能想看看这个:--似乎工作得很好,包括对内联图像的支持。