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

时间:2015-05-14 23:07:56

标签: ios uitableview swift autolayout

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

enter image description here

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

当我在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

3 个答案:

答案 0 :(得分:19)

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

答案 1 :(得分:15)

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

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

答案 2 :(得分:-1)

您需要检查viewWillLayoutSubviewsviewDidLayoutSubviews中的宽度。

如果您将println(self.tableView.frame.width)加入viewDidLoadviewWillAppearviewDidAppearviewWillLayoutSubviewsviewDidLayoutSubviews,您就可以在调用每个方法时查看宽度。