自定义UITableViewCell具有自动布局和附件视图

时间:2015-05-08 02:42:18

标签: ios objective-c uitableview ios-autolayout uitableviewautomaticdimension

我有一个使用自动布局的自定义表格视图单元格,并将公开指示符作为附件视图。 首次显示时,屏幕上单元格的单元格大小完全错误:

正如你所看到的那样,这个细胞占据了大约1.5个屏幕的空间:

enter image description here

但是,如果我旋转设备并向后旋转,它看起来很好:

enter image description here

正如你在这里看到的,我没有做过任何复杂的事情:

enter image description here

我有一个非常非理想的解决方法:

Contact

但是,当您第一次看到屏幕时,这显然会导致“闪光”。在更复杂的情况下,闪光灯更加明显。

我有另一种解决方法,但这会导致自动布局异常:

Account

例外:

enter image description here

至少这种方法不会给我UI闪烁。

如果我删除附件视图,它实际上可以正常工作。

更新:我已经向github添加了一个示例项目: https://github.com/fwaddle/TableCellAccessoryTest

更新#2:关于这个错误的另一项工作是在代码中布局单元格。我只是尝试在代码中做同样的事情,它没有抛出警告并且工作正常。看起来像是一个IB小虫。

有关如何解决此问题的任何想法? 感谢。

2 个答案:

答案 0 :(得分:3)

实现以下委托方法,因为这解决了我的问题。

- (void)tableView:(UITableView *)tableView   
willDisplayCell:(UITableViewCell *)cell 
forRowAtIndexPath:(NSIndexPath*)indexPath
  

表视图在使用之前将此消息发送到其委托   单元格绘制一行,从而允许委托自定义   显示之前的单元格对象。这个方法给代表一个   有可能覆盖表格前面设置的基于状态的属性   视图,例如选择和背景颜色。代表之后   返回时,表视图仅设置alpha和frame属性,以及   然后只有当它们滑入或滑出时动画行。

将此代码添加到tableViewController:

 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell   forRowAtIndexPath:(NSIndexPath *)indexPath{

    BasicCell *basicCell = (BasicCell *)cell;
    basicCell.basicLabel.text = @"Hello this is just some text that should get the label to go over multiple lines";

}

答案 1 :(得分:0)

因此,即使在代码中创建约束,有时也无法解决此问题。您似乎还需要进行一些更改。在您的自定义表格单元格中添加以下内容,尤其是在您根据单元格的内容更改附件类型时(例如,选中标记):

-(void) setAccessoryType:(UITableViewCellAccessoryType)accessoryType {
  [super setAccessoryType:accessoryType];
  [self setNeedsUpdateConstraints];
}

同样删除故事板中的原型单元格并注册您的课程:

-(void) viewDidLoad {
  [super viewDidLoad];
  [self.tableView registerClass:[MyCustomCell class] forCellReuseIdentifier:@"MyCustomCell"];
}

我偶尔会发现我仍然需要强制标签(特别是多线标签)在cellForRowAtIndexPath中重新布局:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCustomCell" forIndexPath:indexPath];
  cell.customLabel.text = .....
  [cell.customLabel layoutIfNeeded];
  return cell;
}

上述所有问题都解决了我的问题所以我希望它们对别人有用,而且你不会浪费大量时间。

我还没有收到苹果公司关于错误报告的任何回复,但我认为这很正常。