2013-10-15 50 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]; 

我沒有測試此,但(還是有很多東西我都代碼循環通過數據和所有這些),但它應該工作。正如我所說,所有我看到的硬編碼的例子的大小,所以我想我會張貼這個以防其他人來尋找如何做,或者如果我以後忘記=)。