1

在我的 iPad 应用程序中,我将UITableView在弹出窗口中显示一个。我有多个要显示的值,因此我UITableViewCell使用多个标签进行了自定义,以模拟表格中的许多“列”。我想做的是确保我所有的“列”都排成一行。

问题是,我无法对列的宽度进行硬编码,因为我正在从 XML Web 服务动态填充数据 - 所以在我进行调用并接收到数据之前,我不知道它们需要多宽.

我的想法是遍历数据(一旦我得到它),并使用sizeWithAttributs:方法NSString来获得我的每一列的最大宽度。然后我会将该宽度发送到我的自定义单元格,以便单元格可以在其layoutSubviews方法中使用它。问题是,我正在尝试使用 来完成所有这些NSLayoutConstraints,并且在我看到的所有示例中,任何尺寸constraintsWithVisualFormat:总是硬编码的——直到运行时我才知道我的尺寸是多少。我的想法是做类似的事情

NSDictionary *myDictionary = NSDictionaryOfVariableBindings(myLabel1,myLabel2)
NSArray *myConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[myLabel1(%d)]-[myLabel2(%d)]",myWidth1,myWidth2 options:NSLayoutFormatAlignAllBaseline metrics:nil views:myDictionary];

但这会导致构建错误。是否可以constraintsWithVisualFormat在运行时动态提供大小,而不是硬编码?

4

2 回答 2

3

推荐的方法是使用metrics参数:

NSDictionary *myDictionary = NSDictionaryOfVariableBindings(myLabel1,myLabel2)
NSArray *myConstraints = [NSLayoutConstraint 
          constraintsWithVisualFormat:@"H:|-[myLabel1(lbl1w)]-[myLabel2(lbl2w)]" 
                              options:NSLayoutFormatAlignAllBaseline 
                              metrics:@{@"lbl1w": @(myWidth1),
                                        @"lbl2w": @(myWidth2) } 
                                views:myDictionary];

这基本上允许您提供将名称映射到数值的字典,以便在可视格式字符串中的任何位置使用。这些值需要是NSNumber实例,可以使用@(aVariable)去年引入的构造从 C 数值变量轻松构造。

于 2013-10-15T23:58:14.867 回答
0

当我写这篇文章的时候,我有一种不愚蠢的感觉,这促使我看看你实际上应该作为第一个参数传递的内容constraintsWithVisualFormat,而且果然,它只是在寻找一个NSString. 所以解决方案是简单地将前面的字符串断开:

NSString *formattedString = [NSString stringWithFormat:@"H:|-[myLabel1(%d)]-[myLabel2(%d)]",myWidth1,myWidth2];

然后传入:

NSArray *myConstraints = [NSLayoutConstraint constraintsWithVisualFormat:formattedString options:NSLayoutFormatAlignAllBaseline metrics:nil views:myDictionary];

我还没有测试过这个(我仍然需要编写很多东西来循环遍历数据和所有这些),但它应该可以工作。正如我所说,我看到的所有示例都对尺寸进行了硬编码,所以我想我会发布这个,以防其他人来寻找如何做到这一点,或者以防我稍后忘记=)。

于 2013-10-15T19:06:21.293 回答