在创建时调整自定义UITableViewCell的子视图的大小

时间:2013-04-26 23:39:07

标签: ios objective-c uitableview

我正在尝试使用自己的XIB创建自定义UITableViewCell,其中包含两个重要的可编辑组件:

  • 的UILabel
  • UIImage with'end-cap insets' - 此图片位于标签后面,并随之调整大小

当我创建我的UITableViewCell时,我可以轻松设置其标签的文本,但在同样的方法中,我也尝试更改UIImage的框架以匹配UILabel的框架。但是,直到我通过滚动表格视图将单元格出列并重新进入视图来重新加载单元格时才会发生这种情况。

我在视图控制器的.m:

中创建自定义表格视图单元格
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *UITableViewCellIdentifier = @"msgCell";

    RMMessageCell *cell = [tableView dequeueReusableCellWithIdentifier:UITableViewCellIdentifier];

    if (cell == nil) {
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"MessageCell" owner:self options:nil];
        cell = [topLevelObjects objectAtIndex:0];
        [cell customInit]; //This sets up the ImageView's image etc
    }

    [cell setMessageValue:[_messages objectAtIndex:indexPath.row]]; //SEE BELOW

    return cell;
}

...在我的自定义单元格.m中,我处理设置文本标签并使用此方法调整图像大小:

- (void)setMessageValue:(NSString *)message {

    _testLabel.text = message;
    // Assume the text label's frame has already been set to the message's length 
    // (will add this in once I figure out how to change the imageView's 
    // frame correctly)

    // Set the image view's frame to the label's
    // THIS DOES NOT TAKE EFFECT UNTIL THE TABLE VIEW IS RE-SCROLLED
    CGRect frame = _imageView.frame;
    frame.size.width = _testLabel.frame.size.width + 8;
    _imageView.frame = frame;
}

3 个答案:

答案 0 :(得分:1)

这是因为表视图单元格是以一种大小创建的,然后在添加到表格后显示它时会调整大小。如果您记录单元格的边界或框架,当您从笔尖加载它时,您将看到它是一个尺寸(较小),当您通过将其从屏幕上滚动来“刷新”单元格时,您将看到另一个尺寸(更大)并重新开始。

最简单的方法是确保标签和图像都具有相同的自动调整规则,以便在调整单元格大小时,它们一起生长。

答案 1 :(得分:1)

你可以使用UITableView委托方法,

     – (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;

在这里你可以动态设置行的高度..

//这仅适用于您可以设置单元格高度的示例

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

          NSString *text;
     text = [_messages objectAtIndex:indexPath.row];
     CGSize constraint = CGSizeMake(280, 2000);
     CGSize size = [text sizeWithFont:[UIFont boldSystemFontOfSize:12] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];

     return size.height + 5; 

    }

答案 2 :(得分:0)

如果以编程方式创建子视图并将它们添加到tableview单元格(即,它们未在故事板中设置,因此不受显式自动约束),您应该能够控制子视图的大小。

在我的实现中,我创建了一个customCell子类。在.h:

@property (strong, nonatomic) UILabel *customLabel;

然后在.m:

- (id)initWithCoder:(NSCoder *)aDecoder {
    METHOD;
    self = [super initWithCoder:aDecoder];
    if (self) {
        // Initialization code
        self.customLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 40)];
        [self addSubview:self.customLabel];
    }
    return self;
}

在tableViewController的.m文件中,在方法tableView中:cellForRowAtAtIndexPath:

theCell.customLabel.frame = CGRectMake(0, 0, 320, 40);
theCell.customLabel.text = @"Whatever text you want";

这将使您在桌面视图和单元格加载时立即完全控制自定义标签。

为了回应@inafziger,我尝试以编程方式删除标签上的约束,但它没有解决此自动调整大小的问题。

更新:对子视图进行临时引用,然后将其从superview中删除,然后将其添加回子视图,这也很有效,但在我使用标签的情况下略有例外,标签的高度适合它所包含的文本的高度(而在上面的示例中以编程方式创建标签,标签将具有您指定的任何高度。)优点是您不必创建任何自定义标签,甚至触摸子类tableviewCell。只需使用您在故事板中创建的任何内容。这是tableView:cellForRowAtIndexPath:

UILabel *theLabel = theCell.theLabel;
[theCell.theLabel removeFromSuperview];
[theCell addSubview:theLabel];
theCell.theLabel.frame = CGRectMake(0, 0, 320, 40);