Monday, May 28, 2018

Can UITableView scroll with UICollectionView inside it?

Leave a Comment

I have the structures below...

enter image description here

I wrap two of collection views into tableview

One is in tableview header(Collection1), another is in tableview 1st row(Collection2).

All the functions are good (Both collection view).

just...

When I scroll up in Collection2, Collection1 will Not scroll up together, because I'm only scrolling the collectionViews not the tableview.

It only scroll together when I scroll in Collection1.

Is it possible to make the header view scroll with user just like app store's index carousel header?

Or I just went to the wrong place, I should use other ways to approach.

2 Answers

Answers 1

Solution

  • When you keep CollectionView1 as a TableViewHeader, CollectionView1 will always on the top of TableView after it reaches top. If you want Collection1 and Collection2 scroll up together, you need to keep CollectionView1 in a cell, not a header.

  • Make sure CollectionView2 content height smaller or equal to TableViewCell's height. As I checked on App Store, they always make SubCollectionView content height equal to TableViewCell's height (If they use TableView).

Result

For more detail, you can take a look at my sample project

https://github.com/nrober1409/DemoAppStoreHeader

Answers 2

Problem

1) Your tableview cell Collectionview (let's say collection2) , Collection 2 is scrollable. So when you scroll up tableview won't scroll up

Solution

1) Just simple and working solution would be height constant , You have to give height constant to the collection2 with >= relationship and 0 Constant value and 750 priority !!

Now the question is how to use this

You need to take IBOutlet of Height constant to your custom tableview cell and need to manage the collectionview height from there.

Here is example

class FooTableViewCell: UITableViewCell {       static let singleCellHeight = 88;      @IBOutlet weak var titleLabel: UILabel!     @IBOutlet weak var descriptionLabel: UILabel!     @IBOutlet weak var iconsCollectionView: IconsCollectionView!     @IBOutlet weak var const_Height_CollectionView: NSLayoutConstraint!      var delegateCollection : TableViewDelegate?  var bars:[Bar] = [] {         didSet {             self.iconsCollectionView.reloadData()             iconsCollectionView.setNeedsLayout()             self.layoutIfNeeded()              let items:CGFloat = CGFloat(bars.count + 1)             let value = (items / 3.0).rounded(.awayFromZero)              const_Height_CollectionView.constant =  CGFloat((iconsCollectionView.collectionViewLayout as! UICollectionViewFlowLayout).itemSize.height * value)              self.layoutIfNeeded()         }     }      override func awakeFromNib() {         iconsCollectionView.translatesAutoresizingMaskIntoConstraints = false         iconsCollectionView.initFlowLayout(superviewWidth: self.frame.width)         iconsCollectionView.setNeedsLayout()         iconsCollectionView.dataSource = self         iconsCollectionView.delegate = self         const_Height_CollectionView.constant =  iconsCollectionView.contentSize.height         self.layoutIfNeeded()         self.setNeedsLayout()     } } 

You can check my answer Making UITableView with embedded UICollectionView using UITableViewAutomaticDimension Very similar and 100% working

Another solution You can also take UICollectionView with sections which contain another horizontal collectionview , with this solution you don't need to manage contentsize for every cell

Hope it is helpful

If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment