具有多个对齐的 NSAttributedString

问题描述

我有一个 UILabel,我想在其中包含三个具有三种对齐方式的文本:左对齐、居中对齐和右对齐。我发现以下解决方案适用于左对齐和右对齐,但我无法添加中心对齐:

    text = "Pause\n09:30 - 11:30\nsome center text"
    at = NSMutableAttributedString(string: text)
    p1.alignment = .left
    p2.alignment = .right
    p3.alignment = .center
    p2.paragraphSpacingBefore = -labelPause.font.lineHeight
    at.addAttribute(.paragraphStyle,value: p1,range: NSRange(location: 0,length: 4))
    at.addAttribute(.paragraphStyle,value: p3,range: NSRange(location: 4,length: 6))
    at.addAttribute(.paragraphStyle,value: p2,range: NSRange(location: 6,length: 8))
    labelPause.numberOfLines = 0
    labelPause.attributedText = at

应该在中心的文本只是出现在下一行左对齐。我做错了什么?

解决方法

您的某些 NSRange 与您似乎想要定位的字符偏移不匹配。

在操场上试试这个,它对我有用:

import UIKit
import PlaygroundSupport

let text = "Pause\n09:30 - 11:30\nsome centered text"
let at = NSMutableAttributedString(string: text)
let label = UILabel(frame: CGRect(x: 0,y: 0,width: 400,height: 60))
var p1 = NSMutableParagraphStyle()
var p2 = NSMutableParagraphStyle()
var p3 = NSMutableParagraphStyle()

p1.alignment = .left
p2.alignment = .right
p3.alignment = .center
p2.paragraphSpacingBefore = -label.font.lineHeight
p3.paragraphSpacingBefore = -label.font.lineHeight

at.addAttribute(.paragraphStyle,value: p1,range: NSRange(location: 0,length: 5))
at.addAttribute(.paragraphStyle,value: p3,range: NSRange(location: 20,length: 6))
at.addAttribute(.paragraphStyle,value: p2,range: NSRange(location: 6,length: 13))


label.numberOfLines = 0
label.attributedText = at

PlaygroundPage.current.liveView = label

enter image description here