2013-10-15 36 views
1

在我的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]; 

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

回答

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数值变量轻松构建实例。

+0

为什么采用这种方式推荐使用我的方式,是否有特定的原因?使用这些指标对我来说似乎并不简单(我会认为它更复杂)。此外,我不记得看到用于将值链接到临时变量的'metrics'字典,仅用于其他参数,但我看到大量的传递'[NSString stringWithFormat:@“的实例。 。“'''当'NSString'被请求作为输入类型时,而不是'@”...'''。我想我只是有点困惑,为什么约束应该做任何不同。 – GeneralMike

+1

建议不要使用字符串格式*本身*。由于自动布局的可视格式解析器无论如何都要进行字符串解析工作,所以您最好告诉它用一些名称替换它们的数值。你的方式使字符串解析发生两次。而且,实际的名字总会比一堆'%d'更具可读性。最后,如果您要多次重复使用相同的值,这种方式将证明自己的方便。 – matehat

+1

此外,如果要重新使用具有不同宽度或边距的可视格式,或者在可视格式中重复使用一组宽度/边距,则会更清晰。这是值得围绕你的头! – matehat

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]; 

我没有测试此,但(还是有很多东西我都代码循环通过数据和所有这些),但它应该工作。正如我所说,所有我看到的硬编码的例子的大小,所以我想我会张贴这个以防其他人来寻找如何做,或者如果我以后忘记=)。