何时尊重 preferredContentSize?

Posted

技术标签:

【中文标题】何时尊重 preferredContentSize?【英文标题】:When is preferredContentSize respected? 【发布时间】:2014-10-28 15:19:54 【问题描述】:

我有一个表格视图控制器,它在viewDidLoad 之后设置它的内容。设置新内容时,我计算preferredContentSize。在呈现弹出框之前,我可以查询我的视图控制器的preferredContentSize,这是正确的。但是在演示之后,我得到了弹出框的标准尺寸(320x480)。如果我将setPopoverContentSize:animated: 与之前查询的值一起使用,则一切正常。

我现在的问题是为什么它一开始就不尊重preferredContentSize?我做错了什么?

【问题讨论】:

【参考方案1】:

现在我又遇到了同样的问题。如果我把我的桌子高度计算到viewWillAppear 中,它就会起作用:

public override void ViewWillAppear (bool animated)

    base.ViewWillAppear (animated);

    TableView.LayoutIfNeeded ();
    this.PreferredContentSize = new SizeF (320f, TableView.ContentSize.Height);

代码在 C# 中,但您可以轻松地将其转换为 Objective-C 或 Swift。

【讨论】:

这个解决方案非常适合我。谢谢 :D:D:D:D 在 ViewWillAppear() 中这样做并不完全正确,因为表格尚未绘制并且不知道其大小(以及单元格的大小)。所以 TableView.LayoutIfNeeded 是没用的,除非你的表格有恒定的单元格高度并相应地设置。 @CynichniyBandera:你建议什么?应该在哪里调用? @testing 一个普遍的建议是在 viewDidLayoutSubviews() 代码路径中,当视图及其子视图已经获得它们的实际大小(包括本地化字符串、带有省略号的截断标签等) PS。你不需要重新布置你的桌子。在 viewDidLayoutSubviews() 中它已经更新了。 @CynichniyBandera:感谢您的回复。听起来很合理。下次遇到这个问题我会试试的。如果需要,请随时添加答案:)【参考方案2】:

我将测试代码转换为 Swift 2.0。

override func viewWillAppear(animated: Bool) 
   super.viewWillAppear(animated)
   tableView.layoutIfNeeded()
   preferredContentSize.height = tableView.contentSize.height

【讨论】:

以上是关于何时尊重 preferredContentSize?的主要内容,如果未能解决你的问题,请参考以下文章

UIPresentationController preferredContentSize 更新动画

PopoverView 控制器中的问题 PreferredContentSize

preferredContentSize更改窗口大小在osx 10.12.6中不起作用

根据预览视图控制器的 PHAsset 大小计算 preferredContentSize

微服务实践(总)-原文

随手积累的有深意的句段