UITableViewCell 中的大小类
Posted
技术标签:
【中文标题】UITableViewCell 中的大小类【英文标题】:Size Classes in UITableViewCell 【发布时间】:2014-10-09 11:39:38 【问题描述】:在我的 ios 8 应用程序中,我有一个自定义 UITableViewCell
,它是使用自动布局在 .xib 文件中定义的。我已经设置了 UITableView
以便它使用自调整大小的单元格,这一切都很好。
在我的单元格的 .xib 文件中,我设计了“Any x Any”大小类,它可以工作。我还想为“Compact x Any”尺寸类提供不同的设计,所以我将该布局添加到我的 .xib 中。
当我在 iPhone 设备(真实设备或模拟器)上运行应用程序时,我发现单元格的大小总是像使用我的“任意 x 任意”布局一样,但单元格的内容总是像它使用我的“Compact x Any”尺寸类。无论方向如何,都会发生这种情况。
在 iPad 设备(真实或模拟器)上,它总是使用“Any x Any”布局来确定大小和布局,我认为这是正确的。
有没有其他人试过这个并让它在 iPhone 上工作?感觉我正在尝试做的事情不应该是一个不寻常的要求。
总而言之,我认为布局在所有设备上都正确发生,但自调整单元逻辑似乎不尊重它所在的大小类。
【问题讨论】:
【参考方案1】:这似乎是一个已知的错误,在此处描述:rdar://17799811。
解决方法是在我的视图控制器的viewDidAppear
方法中调用tableView.reloadData()
。它确实有效,但是有一个丑陋的重绘,您会在以正确的大小重绘之前暂时看到压扁的视图内容。
此外,在 iPhone 6 Plus 上,当您将方向从纵向更改为横向时,垂直尺寸类别会从紧凑型变为常规,因此在发生这种情况时我还需要重新绘制。我可能会捕捉到方向变化,但相反(我认为这是更“正确”的方法)我选择在我的视图控制器中覆盖较新的 traitCollectionDidChange
方法。我只是在那里打电话给tableView.reloadData()
。在这种情况下,变化非常顺利,我对此很满意。当表格视图首次显示时,这只是最初的丑陋重绘让我感到厌烦。
更新:我发现将我的一个垂直约束的优先级放宽到 999 会使重绘变得不那么难看。单元格的高度仍然变化很大,但至少内容没有改变大小。
【讨论】:
不知道我看到的问题是不是和你说的一样;我看到布局不正确,直到我滚动表格或旋转到横向然后再返回(我只看到 IB 创建的单元格,而不是代码创建的单元格)。为我解决的问题是在单元格的 didMoveToSuperview 方法的覆盖中调用 layoutIfNeeded。 @rdelmar 感谢您的评论。它没有解决我的问题,但值得一试:-) 我在viewWillAppear
中调用tableView.layoutIfNeeded
。您也可以先调用tableView.setNeedsLayout
来强制重绘。以上是关于UITableViewCell 中的大小类的主要内容,如果未能解决你的问题,请参考以下文章
在 UITableViewCell 中更改大小类时的 UIStackView 布局问题