标签在UITableViewCell中对齐

时间:2009-07-15 15:12:36

标签: iphone cocoa-touch uitableview

我将 UITableView 与使用 UITableViewCellStyleSubtitle 创建的单元格一起使用。使用

动态调整每个单元格的高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

委托方法。

你可以在图片上看到的问题

注意:图片已更新

http://img.skitch.com/20090715-g7srxgee2d7fhi5rab2wufrdgm.png

如何将textLabel 和detailTextLabel 对齐到单元格的顶部? (我真的不会通过继承UITableViewCell并重写layoutSubviews来实现它)

感谢名单

4 个答案:

答案 0 :(得分:36)

嗯,这个花了我一个下午,但我想我弄明白了。据我所知,这似乎是UITableViewCell如何布局textLabel和detailTextLabel的一个错误。当您设置行高时,它似乎为两个标签分配相同的高度,这意味着您获得了上面看到的行为,即使detailTextLabel需要更多空间。以下是我为解决问题所做的两件事。我不得不将UITableViewCell子类化来修复它,但它只需要很少量的代码。

首先,确保正确计算每一行的高度。将此方法放入表视图委托中。用您自己的字体方法替换:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
   NSString *cellDetailText = [[self itemForIndexPath: indexPath] detailDescription];
   NSString *cellText = [[self itemForIndexPath: indexPath] description];
   // The width subtracted from the tableView frame depends on:
   // 40.0 for detail accessory
   // Width of icon image
   // Editing width
   // I don't think you can count on the cell being properly laid out here, so you've
   // got to hard code it based on the state of the table.
   CGSize constraintSize = CGSizeMake(tableView.frame.size.width - 40.0 - 50.0, CGFLOAT_MAX);
   CGSize labelSize = [cellText sizeWithFont: [self cellTextLabelFont] constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
   CGSize detailSize = [cellDetailText sizeWithFont: [self cellDetailTextLabelFont] constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];

   CGFloat result = MAX(44.0, labelSize.height + detailSize.height + 12.0); 
   return result;
}

然后,继承UITableViewCell并覆盖layoutSubviews:

#import "UITableViewCellFixed.h"


@implementation UITableViewCellFixed
- (void) layoutSubviews {
   [super layoutSubviews];
   self.textLabel.frame = CGRectMake(self.textLabel.frame.origin.x, 
                                      4.0, 
                                      self.textLabel.frame.size.width, 
                                      self.textLabel.frame.size.height);
   self.detailTextLabel.frame = CGRectMake(self.detailTextLabel.frame.origin.x, 
                                           8.0 + self.textLabel.frame.size.height, 
                                           self.detailTextLabel.frame.size.width, 
                                           self.detailTextLabel.frame.size.height);
}
@end

答案 1 :(得分:8)

这是另一种没有子类化单元格的解决方案,因此它肯定适用于不同的表格样式。 (我还没有检查过其他解决方案。)标题和详细信息字符串在我的UITableViewController标头中声明并已定义。它们不是很长,当然在4000高度之内!

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{

    CGRect frame = [UIScreen mainScreen].bounds;
    CGFloat width = frame.size.width;

    int section = indexPath.section;
    int row = indexPath.row;

    NSString *title_string = [title_strings_array objectAtIndex:row];
    NSString *detail_string = [detail_strings_array objectAtIndex:row];

    CGSize title_size = {0, 0};
    CGSize detail_size = {0, 0};

    if (title_string && [title_string isEqualToString:@""] == NO ) {
        title_size = [title_string sizeWithFont:[UIFont systemFontOfSize:22.0]
                              constrainedToSize:CGSizeMake(width, 4000)
                                  lineBreakMode:UILineBreakModeWordWrap];
    }

    if (detail_string && [title_string isEqualToString:@""] == NO ) {
        detail_size = [detail_string sizeWithFont:[UIFont systemFontOfSize:18.0]
                                constrainedToSize:CGSizeMake(width, 4000)
                                    lineBreakMode:UILineBreakModeWordWrap];
    }

    CGFloat title_height = title_size.height;
    CGFloat detail_height = detail_size.height;

    CGFloat content_size = title_height + detail_height;

    CGFloat height;

    switch ( section ) {

        case 0:
            height = content_size;
            break;

        //Just in case  
        default:
            height = 44.0;
            break;

    }

    return height;

}

答案 2 :(得分:1)

但是你要调整你的细胞大小,你应该使用NSString的各种大小调整方法。这样,您就可以精确地确定制作单元格的高度并避免空白。

答案 3 :(得分:-2)

如果事实证明textLabel和detailTextLabel是使用自动调整掩码布局的,那么当你返回单元格时可能会这样做:

cell.textLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin;
cell.detailTextLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

如果这样可行,则比子类化单元格要容易一些。我没试过。