在 UITableViewCell 中检测具有灵活宽度的视图的最终布局大小

Posted

技术标签:

【中文标题】在 UITableViewCell 中检测具有灵活宽度的视图的最终布局大小【英文标题】:Detect Final Layout Size for View with Flexible Width in UITableViewCell 【发布时间】:2015-05-14 23:07:56 【问题描述】:

我在一个仅限 ios 8 的应用程序中使用尺寸类,并且我在 UITableViewCell 内有一个具有灵活宽度的视图。其自动布局约束定义如下:

如您所见,其宽度因设备宽度/方向而异。

当我在 cellForRowAtIndexPath 中打印它的框架时,我看到 (180.0, 10.0, 400.0, 60.0) 显示 400 宽度。但是当我在模拟器中测量视图时,它只有 175 宽,而我的视图内容被截断(我在里面画了一些东西)这一事实进一步证明了这一点。

我如何知道UITableViewCell 的约束和子视图何时完全完成渲染,以便我可以在视图中重绘内容?

更新

cellForRowAtIndexPath 中,我正在执行以下操作来获取单元格:

let cell = tableView.dequeueReusableCellWithIdentifier("TimeTypeCell", forIndexPath: indexPath) as! TimeTypeCell

let customField = customFields[indexPath.row]

cell.fieldNameLabel.text = customField["name"] as? String
cell.fieldValueLabel.text = customField["total"] as? String
cell.graphData = customField["totalGraph"] as! [Double]

cell.fieldGraph.dataSource = cell.self
cell.fieldGraph.delegate = cell.self

cell.fieldGraph.reloadData() //This is where the redrawing happens

【问题讨论】:

试试 viewDidLayoutSubviews 据我了解,viewDidLayoutSubviewsUITableViewController 的一种方法。 UITableViewCell 有没有等价的东西? 【参考方案1】:

致电cell.contentView.layoutIfNeeded() 以正确布局内容视图。虽然从tableView.dequeueReusableCellWithIdentifier(_, forIndexPath:) 返回时单元格本身的大小应该是正确的,但内容视图似乎不会立即运行布局,因此如果您需要在此时更新它,则需要手动调用它。

【讨论】:

谢谢!!!!很好的答案!我从 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 调用它 我现在投反对票,因为它似乎不起作用。 就是这样!从 2018 年的 Xcode 9.4.1 开始,它仍然有效。 今天为我工作。 2019 年 4 月 5 日【参考方案2】:

我最终覆盖了UITableViewCell.layoutSubviews 方法:

- (void)layoutSubviews 
    [super layoutSubviews];
    [self.contentView layoutSubviews]; // this does the trick

【讨论】:

【参考方案3】:

您需要检查viewWillLayoutSubviewsviewDidLayoutSubviews 中的宽度。

如果将println(self.tableView.frame.width) 放入viewDidLoadviewWillAppearviewDidAppearviewWillLayoutSubviewsviewDidLayoutSubviews,您将能够在调用每个方法时看到宽度。

【讨论】:

我可以看到表格的宽度,在几次调用viewDidLayoutSubviews 后,有问题的视图显示正确的宽度,但我的问题仍然是我需要知道布局渲染的时间完成,以便我可以在视图中触发重绘。

以上是关于在 UITableViewCell 中检测具有灵活宽度的视图的最终布局大小的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell 滚动检测

检测用户何时在 UITableViewCell 中输入 UITextField

如何在 Swift 中检测对 UITableViewCell 的 UIImageView 的触摸?

检测 UITableViewCell 子视图内的触摸

检测UITableView中当前可见的最后一个UITableViewCell

在 UITableViewCell 中未检测到点击手势