我有一个 ViewController
,其中有一堆 Labels
,按 2 列排列(标题和描述值)。所有 Labels
都是主 View
的子项。
我想要右列的描述标签垂直对齐:
我的第一次尝试:
我为左列的每个 Label
设置了一个固定宽度约束 width = 180
。然后,右列的每个 Label
都有一个 constraint 到其左侧相应的 Label
。
这行得通并且看起来不错,但是我收到了我想摆脱的警告:
Fixed width constraints may cause clipping
我的第二次尝试:
删除了左侧 Labels
的所有固定宽度约束以消除警告。右侧不再对齐。
在 viewDidLoad()
中,我尝试将所有左侧 Labels
' frame sizes 设置为最长 Label
的大小(在我的例子中是“一些很长很长的文字”)
shorterTitle.frame.size = longTitle.frame.size
tinyTitle.frame.size = longTitle.frame.size
虽然这没有任何可见的影响(右标签的左约束似乎不是动态的)。
我的第三次尝试:
我忽略了左侧 Labels
的不同大小,但查看了右侧的标签。
我检查最长左侧 Label
右侧 Label
的 x 位置,并将此位置设置为所有其他右侧 Labels
:
secondDes.frame.origin.x = firstDes.frame.origin.x
thirdDes.frame.origin.x = firstDes.frame.origin.x
这很好,但有一个问题:
如果值 Labels
为空,这将不起作用。在我的应用程序中,这些首先是空的,然后右侧 Labels
的信息从网络服务器下载。
如果我这样做:
secondDes.frame.origin.x = firstDes.frame.origin.x
thirdDes.frame.origin.x = firstDes.frame.origin.x
firstDes.text = "test1"
secondDes.text = "test2"
thirdDes.text = "test3"
右侧不会正确对齐。
所以我更改了顺序,以便首先设置文本,因此 Labels
根据其新文本获得新的宽度大小。
firstDes.text = "test1"
secondDes.text = "test2"
thirdDes.text = "test3"
secondDes.frame.origin.x = firstDes.frame.origin.x
thirdDes.frame.origin.x = firstDes.frame.origin.x
令人惊讶的是,这也不起作用。
原因是:文本属性已设置,但在执行最后两行时,Labels
的大小尚未调整。
所以我必须稍等片刻才能应用尺寸,然后再次调用最后两行。
如果我这样做,用户将能够看到文本跳转。
希望你们有一个想法。
最佳答案
自动布局应该是最好的方法。
关于方案一:
UILabels firstDes、secondDes 和 thirdDes 看起来像是水平居中。如果您现在强制使用 160 的宽度,它绝对会有重叠/中断约束。
iPhone 5s/LE 的宽度为 320。如果“Some long long text:”标签的宽度为 180,它将与“test1”标签重叠。
通常最好使用内在方法。让控件确定其文本需要多少空间。
如果这是您的第一个项目,我建议您查看一些有关自动布局的教程。 (例如 Ray Wenderlich)
编辑:
来自评论的建议。使用 UIView 作为容器。将所有 UILabel 放在那里并按您喜欢的方式对齐它们。 UILabels“test2”和“test3”具有 LayoutContraints,告诉它们与“test1”具有相同的前导。
图 2 显示了您在 StoryBoard 编辑器中查看的约束。如果您不熟悉 Autolayout,通过代码添加它们就不那么简单了。
关于ios - Swift 4 - 对齐两列 UILabel View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55969347/