通常我的方法支持可變的高度細胞是定義一個類方法,可以計算上漿對於給定的模型對象:
+ (CGFloat)heightForBracket:(Bracket*)bracket;
使其成爲一個類方法的優點是可以共享常數(填充值,字體大小,縮進級別等)與您的代碼實際上實現佈局,而不必暴露給任何其他類。如果您想在將來更改這些常量,則只需在單元格子類中的某個位置進行更改即可。一個例子子類實現:
#define kPaddingHorizontal 10.0
#define kPaddingVertical 10.0
#define kFontSizeName 17.0
+ (CGFloat)heightForBracket:(Bracket*)bracket {
// determine the dimensions of the name
UIFont *nameFont = [UIFont systemFontOfSize:kFontSizeName];
CGFloat nameSize = [bracket.name sizeWithFont:nameFont
constrainedToSize:CGSizeMake(300, CGFLOAT_MAX) // 300 is the width of your eventual label
lineBreakMode:NSLineBreakByWordWrapping];
// Apple recommends all cells be at least 44px tall, so we enforce a minimum here
return MAX(44, nameSize.height + 20 + kPaddingVertical*2); // 20 is space for the subtitle label
}
- (id)initWithReuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reuseIdentifier];
if (self) {
// bracket name
self.textLabel.numberOfLines = 0; // 0 makes this variable height
self.textLabel.font = [UIFont systemFontOfSize:kFontSizeName];
self.textLabel.lineBreakMode = NSLineBreakByTruncatingTail;
self.textLabel.backgroundColor = [UIColor clearColor];
// if you wanted to hardcode a specific width, to a subview do it here as a constant and then share it with heightForBracket:
// bracket number
self.detailTextLabel.numberOfLines = 1;
self.detailTextLabel.font = [UIFont systemFontOfSize:14.0];
self.detailTextLabel.lineBreakMode = NSLineBreakByTruncatingTail;
self.detailTextLabel.backgroundColor = [UIColor clearColor];
}
return self;
}
- (void)setBracket:(Bracket*)bracket {
_bracket = bracket;
self.textLabel.text = bracket.name;
self.detailTextLabel.text = [NSString stringWithFormat:@"%@", bracket.bracketId];
}
然後,您可以撥打heightForBracket:
在tableView:heightForRowAtIndexPath:
:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
Bracket *bracket = [brackets objectAtIndex:indexPath.row];
return [BracketTableCell heightForBracket:bracket];
}
tableView:cellForRowAtIndexPath:
變得非常容易,只需設置合適的支架上的細胞:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"BCell";
BracketTableCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[BracketTableCell alloc] initWithReuseIdentifier:CellIdentifier];
}
Bracket *bracket = [brackets objectAtIndex:indexPath.row];
cell.bracket = bracket;
return cell;
}
幾點說明:
你打算使用AUTOL的ayout?我知道你說過你開啓了它並引發了問題,但我不確定這是否是一個調試步驟,或者是否始終需要它。你可以發佈'BracketTableCell'的代碼嗎? – jszumski 2013-04-29 18:02:08
我在BracketTableCell上沒有任何代碼。這是一個定製的表格單元類,具有描述和圖標的屬性。而已。沒有添加其他代碼。除非我應該?哦,如果關閉自動佈局可以給我更多的控制權,那麼我會這樣做。 – gdubs 2013-04-29 18:38:19
你可以發佈嗎?什麼是「描述」......一個「UILabel」?通常情況下,你永遠不想命名一個屬性,因爲它是'NSObject'上的一個方法。我試圖弄清楚你如何確定這個標籤。 – jszumski 2013-05-02 20:21:13