我目前正在將iOS應用程序移植到自動佈局,並且發現了一個我無法解決的問題。問題是UITableView
。Autolayout - 對齊表格單元格中的視圖
表很簡單:
- 每個細胞都包含兩個標籤,與他們之間的水平間距。
- 我想第一個標籤根據內容
- 自動調整大小我想在所有的細胞中的標籤具有相同的寬度
點1和2是簡單的,但我不知道知道如何創建一個約束來強制不同單元格中的視圖具有相同的大小。
是否有任何自動佈局解決方案或我必須手動設置幀?
我目前正在將iOS應用程序移植到自動佈局,並且發現了一個我無法解決的問題。問題是UITableView
。Autolayout - 對齊表格單元格中的視圖
表很簡單:
點1和2是簡單的,但我不知道知道如何創建一個約束來強制不同單元格中的視圖具有相同的大小。
是否有任何自動佈局解決方案或我必須手動設置幀?
我會做這個通過創建一個自定義單元類與兩個標籤。給左標籤一個寬度約束(以及對單元格左邊和centerY的約束),併爲左標籤給出正確的標籤水平間距約束。使IBOutlets成爲兩個標籤,並且還有一個用於左標籤的寬度約束(在我的示例中,我將其稱爲widthCon)。在我的例子中,我給了兩個標籤一個背景顏色,所以我可以看到寬度。我計算viewDidLoad中最長字符串的寬度,然後用這個數字來調整寬度約束的常數的cellForRowAtIndexPath:
@interface TableController()
@property (strong,nonatomic) NSArray *theData;
@property (nonatomic) CGFloat maxWidth;
@end
@implementation TableController
- (void)viewDidLoad {
[super viewDidLoad];
self.theData = @[@"One",@"Two",@"Three Hundred Forty",@"Four",@"Five",@"Six",@"Seven",@"Eight",@"Nine"];
self.maxWidth = 0;
for (NSString *s in self.theData) {
CGSize stringSize = [s sizeWithFont:[UIFont systemFontOfSize:17]];
if (stringSize.width > self.maxWidth) self.maxWidth = stringSize.width;
}
[self.tableView reloadData];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.theData.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
RDCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
cell.widthCon.constant = self.maxWidth;
cell.leftLabel.text = self.theData[indexPath.row];
return cell;
}
這是一個很好的解決方案,所以我會給你的觀點。 – Sulthan
如何是1和3兼容嗎?你是否希望所有的標籤都是任何單元格中最長文本的寬度?你是否也意味着你想要左右標籤的大小相同? – rdelmar
@rdelmar確實如此。我希望所有左邊的標籤具有最長文本的寬度。我唯一的想法是在表格外部隱藏視圖,併爲此視圖添加寬度約束(在代碼中),並在每個單元格中添加左側標籤。 – Sulthan
你確定你想要3嗎?您是否考慮過邊緣情況,例如您是否需要在一行上顯示配件視圖或刪除按鈕? – Maarten