sap*_*api 21 iphone objective-c interface-builder ios
我有一个自定义UITableViewCell子类,它在Interface Builder中应用了autolayout约束.单元格包含多个视图,包括a 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;
}
Run Code Online (Sandbox Code Playgroud)
当单元格首次出现时,UITextField超出正确的框架,并显示在UIView其右侧后面.但是,当我将屏幕上的单元格滚动,暂停,然后向后滚动时,文本会被正确截断.
下面显示了一个示例(在第二次编辑时).
我已经尝试过调用[cell setNeedsLayout]和[cell setNeedsDisplay]进入单元格cellForRowAtIndexPath,以及延迟后执行它们.两者都没有效果.
什么是滚动屏幕执行该操作导致单元格正确显示,我该如何复制或修复底层问题?
编辑:
调用
[self.tableView reloadData];
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic];
Run Code Online (Sandbox Code Playgroud)
为了重新加载单元格,似乎导致布局第一次正确显示.
但是,它现在在滚动时(偶尔)中断(即,当向上滚动时,布局约束现在未正确应用).
调用[cell setNeedsLayout]中cellForRowAtIndexPath似乎没有解决这个问题.
EDIT2:
顶部电池,如图所示这里,似乎正确(如底部电池一样),直到我向下滚动屏幕.它消失了.
这反映了第一次编辑时的问题 - 第二次渲染是问题(让我觉得它可能与重用单元格有关?)
sap*_*api 38
如果你的名字在属性UITableViewCell子类textLabel或defaultTextLabel,则1B将忽略您所指定的约束,并与默认的覆盖它们,并没有发出警告.
甚至在具有Custom样式的IB中设计的单元格中也是如此,该样式没有可见textLabel或detailTextLabel属性.
如果UIImageView在UITableViewCell子类上添加type 属性并为其命名,也会发生这种情况imageView.
按照GitHub这个多行UILabel问题,这是一个挥之不去的iOS bug.
我发现在iOS 9+中,这种情况主要发生在编辑模式中,具有很大的不可预测性.
以下解决方法仅部分有效:它需要重新绘制UITableView两次,但仍未涵盖所有方案.
override func viewDidLoad() {
super.viewDidLoad()
tableView.setNeedsLayout()
tableView.layoutIfNeeded()
tableView.reloadData()
}
Run Code Online (Sandbox Code Playgroud)
笔记:
UITextView是多行的一个很好的替代品UILabel,没有bug.UITextView不会出现任何IULabel其他奇怪现象,如对齐错误或闪烁.self.tableView.editing的truetableView.estimatedRowHeight减少发生的次数| 归档时间: |
|
| 查看次数: |
9095 次 |
| 最近记录: |