1

我有一个UITableViewCell使用情节提要实现的,如下所示:

在此处输入图像描述

这是没有图像的单元格应该是什么样子:

在此处输入图像描述

我一直在摆弄这些限制并努力解决这个问题,但没有运气。我对约束以及如何以编程方式添加它们有很好的理解,但对这个特定问题没有运气,我觉得我只是在没有逻辑思考过程的情况下随意向单元格添加布局约束。该单元格表示一个新闻源帖子,在顶部的主图像视图中可能有也可能没有图像,其行为应如下所示。如果单元格中没有图像,则带有点赞数和评论数的底部栏将向上移动以与单元格顶部对齐。我通过设置一个约束来实现此行为,该约束使较小的图像视图、帖子标题、帖子时间和帖子内容与单元格底部保持一定距离。heightForRowAtIndexPath方法子视图适当地移动。当帖子内容中的文本大于单行时,问题就出现了。单元格的高度调整正确,但文本视图的顶部保持在同一位置并向下增长并溢出到下一个单元格。当我放置约束以将四个子视图与单元格顶部对齐时,当没有图像并且帖子内容大于单行时,我遇到了问题。在这种情况下,单元格的大小调整为小于其原始大小,并且子视图保持在约束指定的距离处。较小的图像、帖子标题、时间和内容被剪裁,不显示。对于这么多不同的情况,这是一个如此奇怪的问题。我已经为此工作了将近两天,并且可以真正使用其他人的想法来解决此问题。

4

2 回答 2

1

我有一种方法可以解决这个问题,但我相信还有很多其他方法。我给两个图像视图一个固定的高度约束。小图像视图和顶部标签(帖子标题)具有固定到单元格顶部的高度——这两者以及大图像视图的高度约束都有 IBOutlets,因此可以在代码中更改它们。底部标签(发布内容)的行数设置为 0,并且有一个 IBOutlet 到其高度约束(所有标签都具有标准的 21 点高度开始)。在代码中,我检查每个 indexPath 是否存在图像,并相应地更改约束。

- (void)viewDidLoad {
    UIImage *image1 = [UIImage imageNamed:@"House.tiff"];
    [super viewDidLoad];
    self.theData = @[@{@"pic":image1, @"post":@"short post"},@{@"post":@"short post"},@{@"pic":image1, @"post":@"Long long post with some extra stuff, and even some more"},@{@"post":@"Long long post with some extra stuff, and even some more"}];
    [self.tableView reloadData];
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.theData.count;
}

-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    CGFloat ivHeight = (self.theData[indexPath.row][@"pic"])? 215 : 0; // 215 is the fixed height of the large image view
    CGSize labelSize = [self.theData[indexPath.row][@"post"] sizeWithFont:[UIFont systemFontOfSize:17] constrainedToSize:CGSizeMake(152, CGFLOAT_MAX)];
    return 140 + ivHeight + labelSize.height; // the 140 was determined empirically to get the right spacing between the 3 labels and the bottom bar
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    RDCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    cell.label.text = self.theData[indexPath.row][@"post"];
    cell.iv.image = self.theData[indexPath.row][@"pic"];
    if(self.theData[indexPath.row][@"pic"] == nil){
        cell.heightCon.constant = 0; // heightCon is the outlet to the large image view's height constraint
        cell.ivTopCon.constant = 8; // ivTopCon is the outlet to the small image view's spacing to the top of the cell
        cell.labelTopCon.constant = 8; // labelTopCon is the outlet to thetop label's spacing to the top of the cell
    }else{
        cell.heightCon.constant = 215; // this number and the following 2 are taken from the values in IB
        cell.ivTopCon.constant = 185;
        cell.labelTopCon.constant = 233;
    }
    CGSize labelSize = [self.theData[indexPath.row][@"post"] sizeWithFont:[UIFont systemFontOfSize:17] constrainedToSize:CGSizeMake(152, CGFLOAT_MAX)];
    cell.labelHeightCon.constant = labelSize.height;
    return cell;
}
于 2013-08-22T21:17:45.820 回答
0

嘿@rdelmar 感谢您的解决方案!最终,我最终只在故事板文件中设计了两个不同的单元,它们具有不同的重用标识符但具有相同的子类。然后,我检查了cellForRowAtIndexPath该单元格是否有内容,并分配了正确的标识符。如果这是不正确的做法,或者会导致问题,请在评论中让我拒绝。

于 2013-08-29T18:03:36.123 回答