Conclusion |

This is a companion discussion topic for the original entry at

Hey Pasan,
I can recreate everything in Swift environment and really works as you just told us. But when I put everything in a SwiftUI UIViewRepresentable, it stopped working.
My issue is, that if I’m using the compositional layout the UIViewRepresentable does not pick it up, but when I change the layout back to the old UICollectionViewFlowLayout it works like a charm.
Here’s my code:

import SwiftUI
import UIKit

enum Section {
    case main

class Cell: UICollectionViewCell {
    var label = UILabel()
    override init(frame: CGRect) {
        super.init(frame: frame)
        label.translatesAutoresizingMaskIntoConstraints = false
        label.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
        label.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")

struct CollectionView: UIViewRepresentable {
    typealias UIViewType = UICollectionView
    func makeUIView(context: Context) -> UICollectionView {
        let collectionView = UICollectionView(frame: .zero, collectionViewLayout: configureLayout())
//        let collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())
        collectionView.backgroundColor = .white
        collectionView.register(Cell.self, forCellWithReuseIdentifier: "cell")
        let datasource = UICollectionViewDiffableDataSource<Section, Int>(collectionView: collectionView) { (cv, ip, num) -> UICollectionViewCell? in
            if let c = cv.dequeueReusableCell(withReuseIdentifier: "cell", for: ip) as? Cell {
                c.label.text = "\(num)"
                c.backgroundColor = .systemRed
                return c
            return nil
        configureDatasource(datasource: datasource)
        context.coordinator.datasource = datasource
        return collectionView
    func configureDatasource(datasource: UICollectionViewDiffableDataSource<Section, Int>) {
        var currentSnapshot = NSDiffableDataSourceSnapshot<Section, Int>()
    func makeCoordinator() -> Coordinator {
    class Coordinator: NSObject {
        var datasource: UICollectionViewDiffableDataSource<Section, Int>!

    func configureLayout() -> UICollectionViewCompositionalLayout {
    let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: .fractionalHeight(1.0))
    let item = NSCollectionLayoutItem(layoutSize: itemSize)
    item.contentInsets = NSDirectionalEdgeInsets(top: 2, leading: 2, bottom: 2, trailing: 2)
    let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: .absolute(44))
    let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item])
    let section = NSCollectionLayoutSection(group: group)
    return UICollectionViewCompositionalLayout(section: section)

    func updateUIView(_ uiView: UICollectionView, context: Context) {

Do you have any idea why?
Thank you

@pasanpr Can you please help with this when you get a chance? Thank you - much appreciated! :]

Unfortunately I don’t have much experience with SwiftUI. I will try and reproduce this myself and get back to you.