我想弄清楚这个问题已经有一段时间了:
我在tableview中有一个自定义单元格它有两个标签一个在另一个下面。顶部标签可以是一行或两行。下面的标签被限制为一行
顶部标签将始终存在,但底部标签将在某些单元格中存在,而在其他单元格中则不存在。
我需要一个方法来弄清楚如何安排这些标签垂直居中。我尝试通过使用cell.label1.numberOfLines = 0;
使顶部标签动态,但然后label1并不真正限于2行。
我尝试通过计算第一个标签的高度来垂直居中这些标签,然后将两个标签居中排列。
如果我使用xib限制行数为2,那么第一个标签的高度总是计算为2行,即使标签消耗1行。我看到的一个问题是,如果我使用[cell.label1 sizeToFit];
,那么在滚动表格时,标签似乎总是改变显示的文本。显示的文本总是对应于相应的标签,但文本有时中途换行,有时使用整行。
下面是我的代码供参考:
CustomCell1 *cell = (CustomCell1 *)[self.tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil)
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell1" owner:self options:nil];
cell = [nib objectAtIndex:0];
cell.label1.lineBreakMode = UILineBreakModeWordWrap;
cell.label1.numberOfLines = 0;
cell.label1.tag = [indexPath row];
}
cell.label1.text = [[responseArray objectAtIndex:[indexPath row]] text];
if([[[responseArray objectAtIndex:[indexPath row]] isDone] isEqualToString:@"N"]) {
cell.label2.text = @"";
} else {
cell.label2.text = @"Done";
}
//[cell.label1 sizeToFit];
CGSize label1Size = [cell.label1 frame].size;
CGFloat label1Height = label1Size.height;
CGRect label1Frame = cell.label1.frame;
int numLines = (int)(label1Height/cell.label1.font.leading);
CGSize label2Size = [cell.label2 frame].size;
CGFloat label2Height = label2Size.height;
CGRect label2Frame = cell.label2.frame;
if(numLines > 1) {
if([cell.label2.text isEqualToString:@""]) {
//if label2 == "" then center label1
label1Frame.origin.y = cellHeight/2 - label1Height/2;
cell.label1.frame = label1Frame;
} else {
label1Frame.origin.y = 12;
cell.label1.frame = label1Frame;
label2Frame.origin.y = 52;
cell.label2.frame = label2Frame;
}
} else {
if([cell.label2.text isEqualToString:@""]) {
CGRect frame = cell.label1.frame;
frame.origin.y = cellHeight/2 - label1Height/2;
cell.label1.frame = frame;
} else {
label1Frame.origin.y = cellHeight/2 - label1Height/2;
cell.label1.frame = label1Frame;
label2Frame.origin.y = cellHeight/2;
cell.label2.frame = label2Frame;
}
}
请帮助我的IOS大师与您的建议。
最好将调整大小的计算移到layoutSubviews中。
//CustomCell.m
- (void)layoutSubviews{
CGRect label1Frame = self.label1.frame;
//Calculate the size of label 1
CGSize label1Size = [self.label1.text sizeWithFont:[self.label1 font]
constrainedToSize:CGSizeMake(label1Frame.size.width,42.0f)
lineBreakMode:NSLineBreakByTruncatingTail];
label1Frame.size.height = label1Size.height;
CGRect label2Frame = self.label2.frame;
//Calculate the size of label 2
CGSize label2Size = [self.label2.text sizeWithFont:[self.label2 font]
constrainedToSize:CGSizeMake(label2Frame.size.width,21.0f)
lineBreakMode:NSLineBreakByTruncatingTail];
label2Frame.size.height = label2Size.height;
//Total height of labels
CGFloat totalHeight = label1Frame.size.height+label2Frame.size.height+5.0f;
//For centering half of difference of two labels with cell
label1Frame.origin.y = (self.frame.size.height - totalHeight)/2.0f;
self.label1.frame = CGRectIntegral(label1Frame);
label2Frame.origin.y = label1Frame.origin.y+label1Frame.size.height+5.0f;
self.label2.frame = CGRectIntegral(label2Frame);
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
CustomCell1 *cell = (CustomCell1 *)[self.tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil)
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell1" owner:self options:nil];
cell = [nib objectAtIndex:0];
cell.label1.lineBreakMode = UILineBreakModeWordWrap;
cell.label1.numberOfLines = 2;
cell.label1.tag = [indexPath row];
}
cell.label1.text = [[responseArray objectAtIndex:[indexPath row]] text];
if([[[responseArray objectAtIndex:[indexPath row]] isDone] isEqualToString:@"N"]) {
cell.label2.text = @"";
} else {
cell.label2.text = @"Done";
}
return cell;
}