IOS - 自我调整细胞问题

时间:2015-07-21 08:58:51

标签: ios uitableview

我正面临使用自动布局自动调整单元格大小的问题。我的目标是实现一个看起来像这样的表:

| Title_label (time)      $price |
|                                |
|Some long description. More     |
|description.                    |
|                                |

当标题很长时,它应该如下所示:

| This title is (time)    $price |
| really long                    |
|                                |
|Some long description. More     |
|description.                    |
|                                |

因此,当标题变得更大时,只要时间和价格有8个点空间,它就会将时间标签推向右侧。如果它更大,它应该换到下一行。

我在使用自定义单元格的表视图之前已经完成了但是只有一个扩展标签,而不是两个。

我已经实现了行的自动高度:

self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 100

这就是我的约束的样子:

|     8px
|8px title 8px time >=8px       price|
|     8px                            |
|8px description                  8px|
|     8px                            |

价格时间和头衔之间也存在顶部对齐。

我已将标题和说明的行号设置为0。 我已将时间和价格的抗压力设置为1000(因为标题与它们重叠)。

但是标题标签不会换行到下一行。它结束于....更多描述标签也太小了。当我滚动表时,desription的高度是固定的。

我尝试在返回cell之前添加cell.layoutIfNeeded()。然后单元格布局搞砸了(标题被剪裁)但是当我滚动tV时一切正常。

有什么想法吗?

编辑: 这是因为标题标签与其他标签相邻,并且它不知道何时应该包裹?

我试过

override func layoutSubviews() {
        self.nameLabel.preferredMaxLayoutWidth -= (durationLabel.frame.width + priceLabel.frame.width + 16)
        super.layoutSubviews()
    }

告诉标题标签它的最大宽度是多少但它会让事情变得混乱。

4 个答案:

答案 0 :(得分:2)

就像你一样,我已经将标题和描述的行设置为0,我已经设置了你的单元格:

|     8px
|8px title 8px time >=8px       price|
|     8px                            |
|8px description                  8px|
|     8px                            |

然后,我设置了压缩和拥抱属性:

<强>标题

  • 拥抱:H:251,V:25​​2
  • 压缩:H:999,V:1000

<强>时间:

  • 拥抱:H:253,V:25​​1
  • 压缩:H:1000,V:750

<强>价:

  • 拥抱:H:252,V:25​​1
  • 压缩:H:1000,V:750

说明

  • 拥抱:H:251,V:25​​1
  • 压缩:H:750,V:999

一切都按预期工作

答案 1 :(得分:2)

enter image description here您可以先将约束首先添加到price,top,height,width。然后将时间标签标记为顶部,尾部,高度,宽度。标题标签为leading,taililing,top,bottom。用于描述标签前导,尾随,顶部,底部。 &安培;写下面的代码。 heightForRowAtIndexPath将为您的单元格提供适当的高度

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static YOUR_TABLEVIEW_CELL *sizingCell = nil;
    static NSString *CellIdentifier=@"YOUR_TABLEVIEW_CELL_IDENTIFIER";
    sizingCell =[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (sizingCell==nil)
    {
        sizingCell=[[YOUR_TABLEVIEW_CELL alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    [self configureFareIssueCell:sizingCell atIndexPath:indexPath];
    return [self calculateHeightForConfiguredSizingCell:sizingCell];
}

//assign all the labels  here
- (void)configureFareIssueCell:(YOUR_TABLEVIEW_CELL* )cell atIndexPath:(NSIndexPath *)indexPath
{
    //e.g 
    cell.lbl.text=@"YOUR_TEXT";
    cell.imageView.image=[UIImage imageNamed:@"NAME_OF_YOUR_IMAGE"];
} 

- (CGFloat)calculateHeightForConfiguredSizingCell:(YOUR_TABLEVIEW_CELL *)sizingCell
{
    CGSize size = [sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
    return size.height + 1.0f; // Add 1.0f for the cell separator height
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   static NSString *CellIdentifier=@"YOUR_TABLEVIEW_CELL_IDENTIFIER";
   YOUR_TABLEVIEW_CELL   *cell =[tableView dequeueReusableCellWithIdentifier:@"YOUR_TABLEVIEW_CELL_IDENTIFIER"];
    if (cell==nil)
    {
        cell=[[YOUR_TABLEVIEW_CELL alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    [self configureFareIssueCell:cell atIndexPath:indexPath];

   return cell;
}  

答案 2 :(得分:2)

尝试添加

[cell layoutIfNeeded]

返回已配置的单元格之前。

答案 3 :(得分:0)

  1. 将最小宽度添加到时间&amp;价格标签

  2. 设置拥抱优先级

  3. 标题标签:

    拥抱:H:1000,V:1000

    压缩:H:1000,V:1000

    描述标签:

    拥抱:H:1000,V:999

    压缩:H:1000,V:999

    1. 在cellforRowAtIndexPath&amp;的最后添加此行。删除layoutSubviews

      细胞?.layoutIfNeeded()

    2. 添加此功能

      func tableView(tableView:UITableView,estimatedHeightForRowAtIndexPath indexPath:NSIndexPath) - &gt; CGFloat {     返回UITableViewAutomaticDimension }

    3. func tableView(tableView:UITableView,heightForRowAtIndexPath indexPath:NSIndexPath) - &gt; CGFloat {         返回UITableViewAutomaticDimension     }

      5 Build&amp;运行