1

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

  • UIL标签
  • 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;
}
4

3 回答 3

1

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

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

于 2013-04-26T23:54:01.630 回答
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; 

    }
于 2013-04-27T06:38:05.113 回答
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,我尝试以编程方式删除标签上的约束,但它没有解决这个自动调整大小的问题。

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

UILabel *theLabel = theCell.theLabel;
[theCell.theLabel removeFromSuperview];
[theCell addSubview:theLabel];
theCell.theLabel.frame = CGRectMake(0, 0, 320, 40);
于 2013-12-04T19:52:27.930 回答