hyp*_*asm 4 iphone objective-c ios
我有一个UILabel,其文本是通过-setAttributedText:
NSAttributedString进行动态设置的,其中包含各种动态属性,即贯穿各处的各种字符的不同字体或样式。UILabel的宽度受限制(通过自动布局),高度是可变的(numberOfLines = 0)。
我需要确定的是给定NSAttributedString和宽度约束后呈现的文本行数。
请注意,我不是在寻找标签的高度,而是在寻找渲染线的数量。还要注意,我无法基于font.lineHeight执行任何计算,因为字体在整个NSAttributedString中都是变化的。
对于某些背景,将为label.textAlignment=NSTextAlignmentCenter行数label.textAlignment=NSTextAlignmentLeft为1 的标签和行数为2或更多的标签进行设置。例如,我将-[UIViewController viewDidLayoutSubviews]在自动布局和UILabel完成业务后进行此操作。也许有一种更简单的方法可以实现相同的目标。
小智 7
这是Swift 3版本
extension NSAttributedString {
func numberOfLines(with width: CGFloat) -> Int {
let path = UIBezierPath(rect: CGRect(x: 0, y: 0, width: width, height: CGFloat(MAXFLOAT)))
let frameSetterRef : CTFramesetter = CTFramesetterCreateWithAttributedString(self as CFAttributedString)
let frameRef: CTFrame = CTFramesetterCreateFrame(frameSetterRef, CFRangeMake(0, 0), path.cgPath, nil)
let linesNS: NSArray = CTFrameGetLines(frameRef)
guard let lines = linesNS as? [CTLine] else { return 0 }
return lines.count
}
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助
从技术上讲,这并不能回答如何学习渲染文本行数的问题,但我确实找到了解决我的问题的方法,所以我想无论如何我都会发布它。
我最终做的是删除标签上的宽度自动布局约束(实际上是超级视图的前导和尾随约束),并在容器约束中添加水平中心。然后在-[UIViewController viewDidLayoutSubviews]我设置label.preferredMaxLayoutWidth=self.view.frame.size.width-margin。标签的textAlignment=NSTextAlignmentLeft.
如果标签只有一行,则达到居中标签;如果标签有两行或更多行,则左对齐,这可以实现相同的效果。
| 归档时间: |
|
| 查看次数: |
2423 次 |
| 最近记录: |