Iphone 退出队列的UITableViewCell在滚动之前的布局不正确(使用自动布局)
我有一个自定义的Iphone 退出队列的UITableViewCell在滚动之前的布局不正确(使用自动布局),iphone,ios,objective-c,interface-builder,Iphone,Ios,Objective C,Interface Builder,我有一个自定义的UITableViewCell子类,它在Interface Builder中应用了自动布局约束。该单元格包含多个视图,包括UITextField 相应地,UITextField的大小受到约束,以便在它和下一个视图之间有默认的水平间距 单元格的实例化如下所示: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { sta
UITableViewCell
子类,它在Interface Builder中应用了自动布局约束。该单元格包含多个视图,包括UITextField
相应地,UITextField
的大小受到约束,以便在它和下一个视图之间有默认的水平间距
单元格的实例化如下所示:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"ProgressCell";
ProgressCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier
forIndexPath:indexPath]
cell.textField.text = @"Some string that is different for each cell";
return cell;
}
当单元格第一次出现时,UITextField
超出正确的帧,并出现在右侧的UIView
后面。但是,当我将单元格从屏幕上滚动、暂停,然后向后滚动时,文本被正确截断
下面显示了一个示例(在第二次编辑时)
我已尝试调用[cell setNeedsLayout]
和[cell setNeedsDisplay]
中的单元格,并在延迟后执行这些操作。两者都没有效果
屏幕外滚动是什么导致单元格正确显示的?我如何复制此操作或修复潜在问题
编辑:
召唤
[self.tableView reloadData];
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic];
要重新加载单元格,显示将使布局第一次正确显示
但是,它现在在滚动时(偶尔)会中断(即,当向后滚动时,布局约束现在没有正确应用)
在cellforrowatinexpath
中调用[cell setNeedsLayout]
似乎无法解决此问题
编辑2:
如图所示,在我向下滚动屏幕之前,顶部单元格显示正确(与底部单元格一样)。它从此消失了
这反映了第一次编辑时的问题-问题出在第二次渲染时(使我认为这可能与重用单元格有关?如果在
UITableViewCell
子类textlab
或defaulttextlab
上命名属性,然后IB将忽略您指定的约束,并使用默认约束覆盖它们,而不会发出警告
即使在使用自定义样式在IB中设计的单元格上也是如此,这些单元格没有可见的textlab
或detailtextlab
属性
如果在UITableViewCell
子类上添加类型为UIImageView
的属性,并将其命名为imageView
,也会发生这种情况,这是一个挥之不去的iOS错误
我发现在iOS9+中,这种情况大多发生在编辑模式下,具有很大的不可预测性
以下解决方法仅部分起作用:它需要重新绘制UITableView
两次,但仍不能覆盖所有场景
override func viewDidLoad() {
super.viewDidLoad()
tableView.setNeedsLayout()
tableView.layoutIfNeeded()
tableView.reloadData()
}
注意事项:
- 使用
是多行UITextView
的一个很好的替代方法,没有bugUILabel
不显示任何UITextView
其他异常,如或IULabel
- 还有一个关于的替代解决方案,它对我不起作用,但值得一提
- 当
为self.tableView.editing
true
- 为
tableView.EstimateDrowEight使用较低的值可减少发生率
- gist上的缺陷演示