【问题标题】:UILabel text truncation vs. line breaks in textUILabel 文本截断与文本中的换行符
【发布时间】: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。您在两个标签中遇到的所有问题是什么?

标签: ios swift uilabel uinavigationbar


【解决方案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
    }
}

【讨论】:

    猜你喜欢
    • 2013-12-12
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 2013-12-23
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多