【发布时间】:2015-05-28 16:43:57
【问题描述】:
一些背景: 我正在使用 UITableView 构建一个应用程序,该应用程序显示用户可以使用 UITableViewCell 的子类对其进行投票的民意调查列表。 UITableViewCell 子类有 5 个 IBOutlet UILabel:一个问题标签,然后是 4 个选择标签。民意调查可能有 2、3 或 4 个选项,因此我可能不会显示第 3 和/或第 4 选项标签。每个标签都将“Lines”设置为 0,这样如果文本太长,它们会自动换行。
按照本教程,我设置了布局约束以确保单元格具有动态高度:http://www.raywenderlich.com/87975/dynamic-table-view-cell-height-ios-8-swift
问题标签的内容拥抱优先级为 250,而所有选择标签的优先级为 251。 问题标签的 Content Compression Resistance 优先级为 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;
}
为什么在第一次尝试时渲染不正确?
【问题讨论】:
-
如果在上面代码中返回单元格之前调用
[cell layoutIfNeeded]会发生什么? -
这似乎解决了它,但现在它抱怨表格中第二个单元格的自动布局:它不喜欢第三个和第四个选择标签之间的垂直间距
-
我降低了第 3 和第 4 个选项标签之间的垂直间距约束的优先级,现在一切似乎都很好。我是否以正确的方式解决这个问题?对于我想要完成的事情,这一切似乎有点老套。
标签: ios objective-c uitableview ios8 autolayout