如何解决将UICollectionView嵌套到UITableViewCell中
我正在尝试构建一些东西
我正在尝试使用UICollectionView构建标签列表视图,并将其嵌套到我的自定义UITableViewCell中。
我现在有什么
搜索互联网后,我找到了问题的关键:
- 子类UICollectionView并实现其固有的内容大小属性。
但是,当我将自定义UICollectionView嵌套到一个自定义大小的UITableViewCell中时,整个过程运行不正常。布局已损坏。
无论我如何更改代码,我都会获得以下3个越野车用户界面之一。
收藏视图的高度总是错误的,无论是太小还是太大,它都不能正确地容纳其内容。
当我使用margin
检查视图时,我发现尽管UI损坏了,但集合视图的Debug View Hierarchy
属性具有正确的值。似乎内容大小属性无法及时反映到UI。
contentSize
关于如何创建具有固有内容大小的自定义UICollectionView的解决方案很多。其中一些可以正常工作。但是,当将它们嵌套到UITableViewCell中时,它们都不起作用。
对于仅将一个UICollectionView嵌套到UITableViewCell中而不使用其他视图也有一些答案。但是,如果UITableViewCell中也有一些UILabel,它将无法正常工作。
我将所有代码上传到github。 https://github.com/yunhao/nest-collectionview-in-tableviewcell
谢谢!
解决方法
我将尝试解释发生了什么事情。...
为了易于理解,在您的ListViewController
中,我们仅以一行开始:
override func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
return 1 // items.count
}
在您的ListViewCell
类中,在prepareViews()
的末尾添加以下行:
// so we can see the element frames
titleLabel.backgroundColor = .green
subtitleLabel.backgroundColor = .cyan
collectionView.backgroundColor = .yellow
在您的IntrinsicCollectionView
类中,添加一个print()
语句以向我们提供一些信息:
override var intrinsicContentSize: CGSize {
layoutIfNeeded()
// add this line
print("collView Width:",frame.width,"intrinsic height:",collectionViewLayout.collectionViewContentSize.height)
return CGSize(width: UIView.noIntrinsicMetric,height: collectionViewLayout.collectionViewContentSize.height)
}
当我在iPhone 8上运行该应用程序时,得到以下结果:
并且我在调试控制台中看到了这一点:
collView Width: 66.0 intrinsic height: 350.0
collView Width: 343.0 intrinsic height: 30.0
告诉我的是,要求集合视图在其具有完整框架之前intrinsicContentSize
。
此时,它会填充其单元格,其布局最终以.collectionViewContentSize.height
的{{1}}(此行有六个“标记”单元格)结束。
然后自动布局将执行另一遍操作...收集视图现在具有有效的帧宽度(基于单元格宽度)...并且单元格已重新布置。
不幸的是,表格视图已经 已经 基于初始集合视图350
设置了行高。
因此,有两个步骤可能(应该)解决此问题:
在intrinsicContentSize.height
中,获取标签时使集合视图的内容大小无效:
ListViewCell
然后,在func setTags(_ tags: [String]) {
self.tags = tags
collectionView.reloadData()
// add this line
collectionView.invalidateIntrinsicContentSize()
}
中,我们需要在表的框架改变后重新加载表:
ListViewController
(通过非常快速的测试)似乎可以给我可靠的结果:
并在设备旋转时:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。