以编程方式动态居中2行文本,每行大致相等

时间:2017-03-16 18:45:35

标签: ios swift uilabel

我的情况是,由于本地化,我的文本行长度会有所不同。这将需要显示在屏幕上,使得每条线的长度大致相等,并且居中。

这是我很长的路线。

应该是这样的

  This is my
very long line.

3 个答案:

答案 0 :(得分:2)

所以我对此进行了一次破解,得到的东西现在就像我想要的那样。

我采用本地化字符串,将其设置为空标签,并找出它的大小。 (橙色仅用于说明目的)

根据标签的大小,我将其除以1.8,这给了我一些缓冲空间来解释不一致的单词大小(再次,我不知道提前会有什么)。最后,我将高度乘以2.0,并将其设置为我的新框架。最后,我将它添加到视图中。

虽然需要修改以处理超过2行(目前不是问题),但这样做仍然存在一些示例字符串。

let text = NSLocalizedString("This is my very long line of text.", comment: "")
let instructionLabel = UILabel()
instructionLabel.text = text
instructionLabel.textAlignment = .center
instructionLabel.backgroundColor = .orange
instructionLabel.numberOfLines = 0
let size = instructionLabel.intrinsicContentSize
let newSize = CGSize(width: size.width / 1.8, height: size.height * 2.0)
let rect = CGRect(x: 20, y: 100, width: newSize.width, height: newSize.height)
instructionLabel.frame = rect
view.addSubview(instructionLabel)

产生以下输出:

enter image description here

还有一个更长的一个:

enter image description here

只是有些变化,这是上面的第二个字符串,但是用阿拉伯语:

enter image description here

答案 1 :(得分:0)

你可以这样设置对齐。

myLabel.textAlignment = .center

同时将行数设置为0.如果需要特定宽度,请设置preferredMaxLayoutWidth属性,如下所示:

myLabel.preferredMaxLayoutWidth = 80
myLabel.numberOfLines = 0

答案 2 :(得分:0)

如果您希望它适用于任意本地化(假设使用空格的语言),您需要一种算法将文本分割为空格,然后循环遍历顶部和底部文本的每个组合,测量其宽度,以查看给出了最均匀分布的尺寸。这感觉就像是矫枉过正。

完成了大量的本地化后,最好的办法是在.strings文件中手动插入\n个字符,以调整视觉上不愉快的中断。依赖固定宽度可以适用于多种语言,但不会为您提供所需的灵活性。