努力在UITableView中格式化动态行高

时间:2011-05-07 17:20:16

标签: iphone objective-c ipad

我正在尝试根据文本长度调整UITableView中行的高度。我有以下代码:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellText =[[topics objectAtIndex:indexPath.row] name];
    UIFont *cellFont = [UIFont fontWithName:@"ArialMT" size:17.0];
    CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT);
    CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];

    return labelSize.height + 20;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
        cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
        cell.textLabel.numberOfLines = 0;
        cell.textLabel.font = [UIFont fontWithName:@"ArialMT" size:17.0];
    }
}

然而,它与UIImageView和UIDetailText混淆,图片如下所示:

enter image description here

我该如何解决这个问题?

我试过了:

[cell.imageView setContentMode:UIViewContentModeScaleToFill];
    [cell.imageView setFrame:CGRectMake(0, 0, 16,16)];
    [cell.imageView setBounds:CGRectMake(0, 0, 16,16)];
    [cell.imageView setAutoresizingMask:UIViewAutoresizingNone];
    [cell.imageView setAutoresizesSubviews:NO];

并且似乎没有工作

3 个答案:

答案 0 :(得分:2)

更改单元格子视图框架的工作是在- (void)layoutSubviews类的UITableViewCell中完成的,所以如果你想要改变那种行为,你可以将普通UITableViewCell子类化,然后像:< / p>

@implementation MyTableViewCell

- (void)layoutSubviews {
    [super layoutSubviews];
    self.imageView.frame = CGRectMake( -- your own size -- );
}

@end

答案 1 :(得分:1)

您可以将自己的子视图添加到单元格的内容视图中,而不是按照其他人的建议进行子类化。

来自Customizing Cells

  

如果你想让细胞有所不同   内容组件并拥有这些   布局在不同的地方,或者如果   你想要不同的行为   细胞的特征,你有   两种选择。您可以添加子视图   到的contentView属性   单元格对象或您可以创建自定义   UITableViewCell的子类。

     
      
  • 如果可以使用适当的自动调整设置完全指定内容布局,并且不需要修改单元格的默认行为,则应将子视图添加到单元格的内容视图中。
  •   
  • 当您的内容需要自定义布局代码或需要更改单元格的默认行为时(例如响应编辑模式),您应该创建自定义子类。
  •   

见这个例子:

#define CUSTOM_IMAGE_TAG 99
#define MAIN_LABEL 98

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";
    UIImageView *customImageView = nil;
    UILabel *mainLabel = nil;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        customImageView = [[[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 40.0f, 40.0f)] autorelease];
        customImageView.tag = CUSTOM_IMAGE_TAG;
        [cell.contentView addSubview:customImageView];

        mainLabel = [[[UILabel alloc] initWithFrame:CGRectMake(60.0f, 10.0f, 100.0f, 21.0f)] autorelease];
        mainLabel.tag = MAIN_LABEL;
        mainLabel.numberOfLines = 0;
        [cell.contentView addSubview:mainLabel];
    } else {
        customImageView = (UIImageView *)[cell.contentView viewWithTag:CUSTOM_IMAGE_TAG];
        mainLabel = (UILabel *)[cell.contentView viewWithTag:MAIN_LABEL];
    }

    // Configure the cell.
    CGRect frame = mainLabel.frame;
    frame.size.height = ... // dynamic height
    mainLabel.frame = frame;

    return cell;
}

显然,您仍然需要实施tableView:heightForRowAtIndexPath:

答案 2 :(得分:0)

我认为内置的imageView会忽略您调整它的大小。子类UITableViewCell并添加您自己的自定义UIImageView。然后,您可以控制图像视图的所有方面。

- wisenomad的解决方案无需添加您自己的自定义图像视图和标签即可运行。 -

您还必须更改textLabel的框架。这是一个例子。

- (void)layoutSubviews {
        [super layoutSubviews];
        float sideLength = self.frame.size.height;
        self.imageView.frame = CGRectMake(0.0, 0.0, sideLength, sideLength);
        CGRect textLabelFrame = self.textLabel.frame;
        self.textLabel.frame = CGRectMake(44.0, textLabelFrame.origin.y, textLabelFrame.size.width - 44.0 + textLabelFrame.origin.x, textLabelFrame.size.height);
    }