[英]Swift vertical UICollectionView inside UITableView
I'm developing an app which requires me to have two types of feed inside my ViewController - Horizontal and Vertical. 我正在开发一个应用程序,它要求我的ViewController内部具有两种类型的供稿-水平和垂直。
The structure is like this: ViewController -> UITableView
-> first section has horizontal UICollectionView
-> second section has vertical UICollectionView
. 结构是这样的:ViewController->
UITableView
>第一部分具有水平的UICollectionView
>第二部分具有垂直的UICollectionView
。
My issue is that i'm unable to get the second section of the UITableView
(which has inside the Vertical UICollectionView
) to have a proper height. 我的问题是我无法使
UITableView
的第二部分(在Vertical UICollectionView
内部具有)具有适当的高度。 It gets interrupted in the middle when I'm scrolling down. 当我向下滚动时,它会在中间中断。
It's important to say that the UICollectionView cell height is not fixed. 重要的是要说UICollectionView单元格的高度不是固定的。
I followed some tutorials and guides out there and saw many use cases of UITableViewAutomaticDimension
, but couldn't get it to work. 我在那里遵循了一些教程和指南,并看到了
UITableViewAutomaticDimension
许多用例,但无法使其正常工作。
Edit: Here is how my storyboard looks like: My StoryBoard This is my main ViewController code: 编辑:这是我的情节提要的样子: My StoryBoard这是我的主要ViewController代码:
class FeedViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { @IBOutlet weak var tableView: UITableView! var stationArray = Array() override func viewDidLoad() { super.viewDidLoad()d } func numberOfSections(in tableView: UITableView) -> Int { return 2 } func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { return categories[section] } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 1 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { if indexPath.section == 0 { let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! FeedHorizontalTableViewCell *Some code* return cell } else { let cell2 = tableView.dequeueReusableCell(withIdentifier: "cell2") as! FeedVerticalTableViewCell *Some code* cell2.setNeedsLayout() return cell2 } } func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { if section == 1 { return 50 } return 0 } func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { return 500 } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { if indexPath.section == 0 { if let cell = tableView.dequeueReusableCell(withIdentifier: "cell") { return cell.frame.height } return 280 } else { return UITableViewAutomaticDimension } } }
This is my vertical UITableViewCell code: 这是我的垂直UITableViewCell代码:
class FeedVerticalTableViewCell: UITableViewCell, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { @IBOutlet weak var collectionView: UICollectionView! var stations = Array() { didSet { collectionView.reloadData() } } override func awakeFromNib() { super.awakeFromNib() } override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return stations.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "feedVerticalCell", for: indexPath) as! FeedVerticalCollectionViewCell *some code* return cell } }
After setting UITableView cell height to be dynamic in you view controller. 将UITableView单元格高度设置为动态后,在视图控制器中。
tableView.estimatedRowHeight = 100
tableView.rowHeight = UITableViewAutomaticDimension
Create a subclass for your vertical collectionView and override intrinsicContentSize. 为您的垂直collectionView创建一个子类,并覆盖internalContentSize。
class DynamicCollectionView: UICollectionView { override func layoutSubviews() { super.layoutSubviews() if !__CGSizeEqualToSize(bounds.size, self.intrinsicContentSize) { self.invalidateIntrinsicContentSize() } } override var intrinsicContentSize: CGSize { return collectionViewLayout.collectionViewContentSize } }
In Interface builder change the class of your collectionView to DynamicCollectionView (subclass UICollectionView). 在“界面”构建器中,将您的collectionView的类更改为DynamicCollectionView(子类UICollectionView)。
Set estimated cell size of UICollectionViewFlowLayout. 设置UICollectionViewFlowLayout的估计单元格大小。
flowLayout.estimatedItemSize = CGSize(width: 1,height: 1)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.