UITableViewCell第一次加载时无法正确呈现

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文件(关注顶部单元格):

滚动tableView

这是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)

为什么第一次尝试时渲染不正确?

Pra*_*ore 8

对我来说,在您的表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)


Alo*_*lok 5

我也遇到了同样的问题并使用以下技巧解决了:

    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