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

(因为,如果 titlelargeUILabel 带有 .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 文本截断与文本中的换行符的主要内容,如果未能解决你的问题,请参考以下文章

iOS 自动布局 UILabel 换行

仅突出显示 UILabel 中的文本

文本更改后 UILabel 未正确换行

换行换行符不适用于 UILabel 仅适用于特定文本字符串

UIPickerView 中的文本换行

UILabel 自动换行/字符换行