我在仅限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
答案 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)
您需要检查viewWillLayoutSubviews
或viewDidLayoutSubviews
中的宽度。
如果您将println(self.tableView.frame.width)
加入viewDidLoad
,viewWillAppear
,viewDidAppear
,viewWillLayoutSubviews
和viewDidLayoutSubviews
,您就可以在调用每个方法时查看宽度。