在 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 据我了解,viewDidLayoutSubviews
是UITableViewController
的一种方法。 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】:您需要检查viewWillLayoutSubviews
或viewDidLayoutSubviews
中的宽度。
如果将println(self.tableView.frame.width)
放入viewDidLoad
、viewWillAppear
、viewDidAppear
、viewWillLayoutSubviews
和viewDidLayoutSubviews
,您将能够在调用每个方法时看到宽度。
【讨论】:
我可以看到表格的宽度,在几次调用viewDidLayoutSubviews
后,有问题的视图显示正确的宽度,但我的问题仍然是我需要知道布局渲染的时间完成,以便我可以在视图中触发重绘。以上是关于在 UITableViewCell 中检测具有灵活宽度的视图的最终布局大小的主要内容,如果未能解决你的问题,请参考以下文章
检测用户何时在 UITableViewCell 中输入 UITextField
如何在 Swift 中检测对 UITableViewCell 的 UIImageView 的触摸?