我使用AutoLayout创建了一个动态单元格,将代码置于(void)updateConstraints
单元格的subview
方法中,设置BOOL
值,使自定义AutoLayout代码只运行一次,并在View Controller中调用
[cell setNeedsUpdateConstraints];
[cell updateConstraintsIfNeeded];
在返回细胞之前。一切似乎都运行良好但我遇到了奇怪的问题,当我选择单元格所有的子视图(或其本身?)改变位置。
用这个美丽的箭头指向的细胞显示它;]
答案 0 :(得分:1)
我经历了同样的错误并且修补了大约一天来解决这个问题...为了解决问题的根源我在细胞上设置了不同的背景颜色&内容视图。在第一次显示表视图后,一切似乎都有效,但在选择单元格之后,contentView会跳转 - 有时在选择时,有时在取消选择时(我在tableView:didSelectRowAtIndexPath:
中立即执行),并且单元格的背景变得可见。所以我认为单元格不知何故没有重新建立正确的contentView维度。
最后,事实证明,至少在iOS 8中,您需要为单元格和contentView设置适当的autoresizingMasks,然后通过将translatesAutoresizingMaskIntoConstraints设置为YES,使布局系统将它们转换为约束。同时,在contentView的所有子视图中,此标志必须为NO。
所以这是我对自定义单元格的初始化:
- (void)awakeFromNib {
// enable auto-resizing contentView
[self setTranslatesAutoresizingMaskIntoConstraints:YES];
[self.contentView setTranslatesAutoresizingMaskIntoConstraints:YES];
self.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
// remove autoresizing constraints from subviews
for (UIView *view in [self.contentView subviews]) {
view.translatesAutoresizingMaskIntoConstraints = NO;
}
}
对我来说就像一个魅力。为了记录,我正在使用iOS 8中引入的UITableViewCell自动调整大小,如下所示:
// enable automatic row heights in your UITableViewController subclass
self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 80.0; // set to whatever your "average" cell height is
答案 1 :(得分:0)
我找到了解决这个问题的方法,我使用了这个链接dynamic-cell-layouts-variable-row-height下的指令来实现动态表格视图单元格:[Using Auto Layout in UITableView for dynamic cell layouts & variable row heights
[1]:Using Auto Layout in UITableView for dynamic cell layouts & variable row heights。作者建议在单元格的子视图中使用updateConstraints
方法时,使用这两种方法更新约束。
[cell setNeedsUpdateConstraints];
[cell updateConstraintsIfNeeded];
但我在我的案例中发现的是,有些问题并非所有细胞都按照应有的方式更新。解决方案是在(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
中调用[cell updateConstraints],而不是等到系统更新约束。