linus_hologram
linus_hologram

Reputation: 1705

UICollectionView sectionInsets not respected when using Header Cells

I am trying to create a collection view that has a header cell (dynamically sized) and some "normal" content cells (also dynamically sized). Therefore, the collection view is initialized as follows:

private lazy var timelineCollectionView: UICollectionView = {
        let flowLayout = UICollectionViewFlowLayout()
        flowLayout.scrollDirection = .vertical
        flowLayout.sectionInset = UIEdgeInsets(top: self.coloredTitleBarHeight, left: 0, bottom: 0, right: 0) // assume that coloredTitlebarHeight is a constant of 120
        flowLayout.estimatedItemSize = CGSize(width: self.view.frame.width, height: 10)
        flowLayout.minimumInteritemSpacing = 0
        flowLayout.minimumLineSpacing = 0

        let cv = UICollectionView(frame: .zero, collectionViewLayout: flowLayout)
        cv.alwaysBounceVertical = true
        cv.contentInsetAdjustmentBehavior = .never 
        cv.backgroundColor = .clear
        cv.scrollIndicatorInsets = UIEdgeInsets(top: self.coloredTitleBarHeight - self.getStatusBarHeight(), left: 0, bottom: 0, right: 0)

        cv.delegate = self
        cv.dataSource = self
        cv.register(TLContentCell.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "content-header-cell")
        cv.register(TLContentCell.self, forCellWithReuseIdentifier: "comment-cell")

        return cv
    }()

The collectionView is part of a ViewController that conforms to the following protocols: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout

Then, I use the following code to create a header cell:

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
        let cell = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "content-header-cell", for: indexPath) as! TLContentCell

        cell.timelineContent = tlContentItem
        cell.delegate = self

        return cell
    }

Last but not least, the dequeuing of the regular cells:

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 1
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "comment-cell", for: indexPath)

        return cell
    }

Output:

The collectionView displays the header cell as well as the item cells, however, the section Insets are not applied.

I would be very happy if you could provide me with any suggestion regarding this strange behavior.

Upvotes: 0

Views: 704

Answers (1)

Blazej SLEBODA
Blazej SLEBODA

Reputation: 9915

Section insets are applied to contents only in UICollectionViewFlowLayout.

Using Section Insets to Tweak the Margins of Your Content

Section insets are a way to adjust the space available for laying out cells. You can use insets to insert space after a section’s header view and before its footer view. You can also use insets to insert space around the sides of the content. Figure 3-5 demonstrates how insets affect some content in a vertically scrolling flow layout. source

enter image description here

Upvotes: 0

Related Questions