ios - Swift 4 - 对齐两列 UILabel View

标签 ios swift

我有一个 ViewController,其中有一堆 Labels,按 2 列排列(标题和描述值)。所有 Labels 都是主 View 的子项。 我想要右列的描述标签垂直对齐:

enter image description here

我的第一次尝试:

我为左列的每个 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,通过代码添加它们就不那么简单了。

enter image description here enter image description here

关于ios - Swift 4 - 对齐两列 UILabel View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55969347/

相关文章:

javascript - jQuery Chained - 不适用于 iOS

ios - 如何检查在 UIAlertController 中创建的 UITextField 的文本?

swift - 交换字典中值的键?

ios - IBM MFP 日志在 ios 模拟器上禁用

ios - 如何让 tabBarController 在第二个ViewController加载时自动加载

swift - Codable 错误 - 预期解码 Dictionary<String, Any> 但发现了一个数组

发送到实例的 iOS 类别属性无法识别的选择器

ios - 从 MPMoviePlayerController 调整缩略图大小

ios - 在 Facebook 和 Twitter 上共享网页内容不起作用 - WebKit iOS Swift

ios - 我们可以在 UITableView 的一部分中快速实现部分吗?