在我的iPad应用程序中,我将在弹出窗口中显示一个UITableView
。我有多个要显示的值,因此我使用多个标签自定义了UITableViewCell
,以模拟表格中的许多“列”。我想要做的是确保我所有的“专栏”都会排成一列。具有自动布局的UITableView中的动态列
问题是,我无法硬编码我的列的宽度,因为我动态地填充XML webservice中的数据 - 所以我不知道需要多大的范围,直到我发出这个调用并收到数据。
我的想法是循环访问数据(一旦得到它),并使用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];
但是这会导致构建错误。是否可以在运行时动态提供尺寸为而不是硬编码?
为什么采用这种方式推荐使用我的方式,是否有特定的原因?使用这些指标对我来说似乎并不简单(我会认为它更复杂)。此外,我不记得看到用于将值链接到临时变量的'metrics'字典,仅用于其他参数,但我看到大量的传递'[NSString stringWithFormat:@“的实例。 。“'''当'NSString'被请求作为输入类型时,而不是'@”...'''。我想我只是有点困惑,为什么约束应该做任何不同。 – GeneralMike
建议不要使用字符串格式*本身*。由于自动布局的可视格式解析器无论如何都要进行字符串解析工作,所以您最好告诉它用一些名称替换它们的数值。你的方式使字符串解析发生两次。而且,实际的名字总会比一堆'%d'更具可读性。最后,如果您要多次重复使用相同的值,这种方式将证明自己的方便。 – matehat
此外,如果要重新使用具有不同宽度或边距的可视格式,或者在可视格式中重复使用一组宽度/边距,则会更清晰。这是值得围绕你的头! – matehat