UILabel 文本截断与文本中的换行符
Posted
技术标签:
【中文标题】UILabel 文本截断与文本中的换行符【英文标题】:UILabel text truncation vs. line breaks in text 【发布时间】:2016-05-24 09:18:24 【问题描述】:我有一个UILabel
,它作为titleView 放在导航栏中。我希望它有 2 行,其中第一行可以截断,第二行居中对齐。
在代码中看起来不像这样:
let label = UILabel()
let text = NSAttributedString(string: "Long long long text\nsecond line")
label.attributedText = text
label.textAlignment = .Center
label.numberOfLines = 0
label.lineBreakMode = .ByTruncatingTail
label.sizeToFit()
self.navigationItem.titleView = label
首行文字不超过可用情况下的效果 空间是这样的:
还不错,但是当第一行文字长于:
let text = NSAttributedString(string: "Very very very very very long text\nsecond line")
我想实现如下。
如何做到这一点?我尝试了 numberOfLines 和 lineBreakMode,但没有成功。
【问题讨论】:
你为什么不用里面有两个UILabel的UIView呢? 使用两个标签会给它们定位带来很多问题,相信我。两个标签是我的第一次尝试,但问题很大,所以我决定尝试使用一个标签。 lineBreakMode 是应用于整个内容的属性,并不适用于每一行。因此,您必须使用两个 UILabel。您在两个标签中遇到的所有问题是什么? 【参考方案1】:将换行模式更改为 ByTruncatingMiddle
而不是 ByTruncatingTail
。像下面这样,
label.lineBreakMode = .ByTruncatingMiddle
希望这会有所帮助:)
【讨论】:
不,它也不起作用。效果与 ByTruncatingTail 相同。 尝试用ByTruncatingMiddle
linebreakmode 评论label.sizeToFit()
注释掉 sizeToFit 导致标签不再可见,因为它的框架没有设置
尝试将标签的框架设置为self.navigationItem.titleView.frame
,然后注释sizetofit
如果字体大小减小一点没有问题,可以使用minimumFontSize
在标签中调整字体大小。【参考方案2】:
带子标题的导航标题(多行导航标题)
将 NSMutableAttributedString 与 UITextView 一起使用,而不是 UILabel
(因为,如果 title 是 large 则 UILabel 带有 .byTruncatingTail 的 lineBreakMode 不适用于第一行在UILabel中)
func multilineNavigation(title:String,subTitle:String)
DispatchQueue.main.async
let titleAttributedStr = NSMutableAttributedString(string: title, attributes: [NSAttributedStringKey.foregroundColor: UIColor.orange,NSAttributedStringKey.font: UIFont(name: "Helvetica Neue", size: 17.0) ?? UIFont()])
let subTitleAttributedStr = NSMutableAttributedString(string: "\n\(subTitle)", attributes: [NSAttributedStringKey.foregroundColor: UIColor.green,NSAttributedStringKey.font: UIFont(name: "Helvetica Neue", size: 12.0) ?? UIFont()])
titleAttributedStr.append(subTitleAttributedStr)
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 1
paragraphStyle.lineBreakMode = .byTruncatingTail
titleAttributedStr.addAttribute(.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, titleAttributedStr.length))
let textView = UITextView()
textView.attributedText = titleAttributedStr
textView.backgroundColor = .clear
textView.isUserInteractionEnabled = false
textView.textContainerInset = .zero
textView.textAlignment = .center
textView.frame = CGRect(x: 0, y: 0, width: textView.intrinsicContentSize.width, height: 44)
self.navigationItem.titleView = textView
【讨论】:
以上是关于UILabel 文本截断与文本中的换行符的主要内容,如果未能解决你的问题,请参考以下文章