中心 3 不均匀标签 - Interface Builder

Center 3 Uneven Labels - Interface Builder

附件是我试图居中的图像以及我使用 XCode 11.2.1

所做的尝试

如何将 3 个不同大小的标签(数字的数据也将是动态的)在视图中水平居中?

我尝试过的事情:

我尝试在 LateBEDView(包含 3 个标签)上设置水平约束,但是当您在模拟器或实际设备上查看它时,它会将所有文本放在中心的右侧。我试过在两侧使用垫片(空视图)但无法弄清楚设置应该是什么?非常感谢任何帮助!

这是我的做法。我会做这个 one 标签,毕竟它很容易居中。好的,我假设你知道该怎么做。

然后我会使用属性字符串来创建字符串的不同部分,包括 "subscripting"。因此,首先我将扩展属性字符串键以包括三个部分:

extension NSAttributedString.Key {
    static let part1 = NSAttributedString.Key(rawValue: "part1")
    static let part2 = NSAttributedString.Key(rawValue: "part2")
    static let part3 = NSAttributedString.Key(rawValue: "part3")
}

然后我将设置标签的属性文本:

let mas = NSMutableAttributedString()
mas.append(NSAttributedString(string: "Late BED = ", attributes: [
    .font:UIFont.systemFont(ofSize: 15),
    .foregroundColor:UIColor.black,
    .part1:"part1"
]))
mas.append(NSAttributedString(string: "20.0", attributes: [
    .font:UIFont.systemFont(ofSize: 15),
    .foregroundColor:UIColor.black,
    .part2:"part2"
]))
mas.append(NSAttributedString(string: " Gy(3.0)", attributes: [
    .font:UIFont.systemFont(ofSize: 9),
    .foregroundColor:UIColor.black,
    .baselineOffset:-10,
    .part3:"part3"
]))
self.label.attributedText = mas

结果和你得到的一样,当然你可以根据需要调整它:

好的,这是真正聪明的部分。因为我划分了属性字符串的三个部分,所以我可以随意查找和更改其中任何一个的文本。正如您所说,每个数字的数据都需要能够更改。这就是你使用三个标签的原因!但现在我要展示如何使用 one 标签来做到这一点。

例如,假设我想将“20.0”更改为“30.4”。那是你的第二个标签,也是我的 .part2。操作方法如下:

let s = self.label.attributedText
// skip past part 1 and find part 2
var r = NSRange()
let mas = s?.mutableCopy() as! NSMutableAttributedString
let _ = mas.attribute(.part2, at: 0, longestEffectiveRange: &r, 
    in: NSRange(location: 0, length: 100))
// find range of part 2
let _ = mas.attribute(.part2, at: r.length, longestEffectiveRange: &r, 
    in: NSRange(location: 0, length: 100))
mas.replaceCharacters(in: r, with: "30.4")
self.label.attributedText = mas