Ada*_*ner 6 objective-c uitableview ios autolayout ios8
一些背景知识:我正在使用UITableView构建一个应用程序,该应用程序显示了一个民意测验列表,用户可以使用UITableViewCell的子类对其进行投票。UITableViewCell子类具有5个IBOutlet UILabels:一个问题标签,然后是4个选择标签。民意测验可能有2、3或4个选择,因此我可能不显示第3个和/或第4个选择标签。每个标签的“行”(Lines)都设置为0,这样,如果太长,它们将自动换行。
我按照本教程设置了布局约束,以确保单元具有动态高度:http : //www.raywenderlich.com/87975/dynamic-table-view-cell-height-ios-8-swift
问题标签的“内容拥抱优先级”为250,而所有选择标签的优先级为251。问题标签的“内容压缩优先级”为751,而所有选择标签的优先级为752。
当我第一次加载应用程序时,第一个民意测验的问题有太多的垂直填充,而第一个民意测验的答案是省略号。但是,当我向下滚动然后向上滚动时,它会自行修复:问题标签会拥抱其内容,而第一个选择将显示其所有内容。
这是我制作的显示问题的GIF文件(关注顶部单元格):

这是Interface Builder的屏幕截图(以防万一):

这是我用来填充单元格标签的代码:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
PollTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kPollCellReuseId];
Poll *poll = [self.polls objectAtIndex: indexPath.row];
cell.questionLabel.text = poll.question;
cell.choiceLabel1.text = [(Choice *)[poll.choices objectAtIndex:0] text];
cell.choiceLabel2.text = [(Choice *)[poll.choices objectAtIndex:1] text];
BOOL hasChoice3 = poll.choices.count > 2;
cell.choiceLabel3.text = hasChoice3 ? [(Choice *)[poll.choices objectAtIndex:2] text] : @"";
cell.choiceLabel3TopConstraint.constant = hasChoice3 ? 8 : 0;
BOOL hasChoice4 = poll.choices.count > 3;
cell.choiceLabel4.text = hasChoice4 ? [(Choice *)[poll.choices objectAtIndex:3] text] : @"";
cell.choiceLabel4TopConstraint.constant = hasChoice4 ? 8 : 0;
return cell;
}
Run Code Online (Sandbox Code Playgroud)
为什么第一次尝试时渲染不正确?
对我来说,在您的表reloadData上添加延迟已解决了问题。
我用了,
self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 500.0;
返回单元格之前的cell.layoutIfNeeded()
但是增加了重新加载tableView的延迟对我来说是固定的。该问题仅在iPad上发生。
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
self.tableView.reloadData()
}
Run Code Online (Sandbox Code Playgroud)
另一个替代解决方案为我工作,
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
//Reload with delay
self.tableView.reloadData()
//Again reload with delay
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
self.tableView.reloadData()
}
}
Run Code Online (Sandbox Code Playgroud)
我也遇到了同样的问题并使用以下技巧解决了:
extension UITableView {
func reloadDataWithAutoSizingCellWorkAround() {
self.reloadData()
self.setNeedsLayout()
self.layoutIfNeeded()
self.reloadData()
}
}
Run Code Online (Sandbox Code Playgroud)
小智 0
实施
-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
Run Code Online (Sandbox Code Playgroud)
并返回任何例如 100 并且不要忘记设置
self.tableView.rowHeight = UITableViewAutomaticDimension
Run Code Online (Sandbox Code Playgroud)
在viewDidLoad