UITableViewCell在被选中后更改子视图位置

时间:2014-12-03 15:26:49

标签: ios objective-c uitableview autolayout

我使用AutoLayout创建了一个动态单元格,将代码置于(void)updateConstraints单元格的subview方法中,设置BOOL值,使自定义AutoLayout代码只运行一次,并在View Controller中调用

  [cell setNeedsUpdateConstraints];
  [cell updateConstraintsIfNeeded];

在返回细胞之前。一切似乎都运行良好但我遇到了奇怪的问题,当我选择单元格所有的子视图(或其本身?)改变位置。

table view

用这个美丽的箭头指向的细胞显示它;]

2 个答案:

答案 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],而不是等到系统更新约束。