[英]Custom UITableViewCell with auto layout and accessory view
我有一个自定义表格视图单元格,它使用自动布局,并有一个披露指标作为附件视图。 首次显示时,屏幕上单元格的单元格大小完全错误:
正如您所看到的那样,该单元占用了大约1.5个屏幕的空间:
但是,如果我旋转设备并向后旋转它看起来很好:
正如你在这里看到的,我没有做过任何复杂的事情:
我有一个非常非理想的解决方法:
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self.tableView reloadData];
}
但是当你第一次看到屏幕时,这显然会导致“闪光”。 在更复杂的情况下,闪光灯更加明显。
我有另一个解决方法,但这会导致自动布局异常:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
BasicCell *cell = [tableView dequeueReusableCellWithIdentifier:@"BasicCell" forIndexPath:indexPath];
cell.basicLabel.text = @"Hello this is just some text that should get the label to go over multiple lines";
[cell.basicLabel layoutIfNeeded];
return cell;
}
例外:
至少这种方法不会给我UI闪烁。
如果我删除附件视图,它实际上完全正常。
更新:我已经向github添加了一个示例项目: https : //github.com/fwaddle/TableCellAccessoryTest
更新#2:关于这个错误的另一项工作是在代码中布局单元格。 我只是尝试在代码中做同样的事情,它没有抛出警告并且工作正常。 看起来像一个IB bug。
有任何想法如何解决这个问题? 谢谢。
实现以下委托方法,因为这解决了我的问题。
- (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";
}
因此,即使在代码中创建约束,有时也无法解决此问题。 您似乎还需要进行一些更改。 在您的自定义表格单元格中添加以下内容,尤其是在您根据单元格的内容更改附件类型时(例如,选中标记):
-(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;
}
以上所有问题都解决了我的问题所以我希望它们对别人有用,而且你不会浪费大量时间。
我还没有听到苹果公司关于错误报告的任何回复,但我认为这很正常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.