How to use rbcollectionviewinfofolderlayout with custom UICollectionViewCell and CollectionViewLayout

What I want to do is display the UICollectionView inside the UICollectionViewCell when this cell is selected. I want to use rbcollectionviewinfofolderlayout to expand my collection view and show a new collection view inside this. However, I am not sure how to implement this in my existing code. I have three views in one view. I hide and disclose my views depending on which user makes the choice. I use a custom xib cell for the cells inside my collection views, and I have a custom collectionviewflowlayout method that ensures that 3 cells will always be displayed in the width of the device.

This is what my view controller looks like.

in my view, DidLoad I need to set the RBCollectionViewInfoFolderLayout to my collection view. As you can see, the layout variable contains mine CustomCollectionViewFlow, which I set as the layout for the collection view, before I implemented RBCollectionviewinfofolderlayout.

    override func viewDidLoad() {
    super.viewDidLoad()

    musicLib.loadLibrary()

    PlaylistCollectionView.indicatorStyle = UIScrollViewIndicatorStyle.White
    AlbumCollectionView.indicatorStyle = UIScrollViewIndicatorStyle.White
    ArtistCollectionView.indicatorStyle = UIScrollViewIndicatorStyle.White

    layout = CustomCollectionViewFlow()

    cview = ArtistCollectionView

    let lay: RBCollectionViewInfoFolderLayout = ArtistCollectionView.collectionViewLayout as! RBCollectionViewInfoFolderLayout
    lay.cellSize = CGSizeMake(80, 80)
    lay.interItemSpacingY = 10
    lay.interItemSpacingX = 0

    let nib = UINib(nibName: "CollectionViewCell", bundle: nil)

    cview.registerClass(UICollectionReusableView.self, forSupplementaryViewOfKind: RBCollectionViewInfoFolderHeaderKind, withReuseIdentifier: "header")
    cview.registerClass(UICollectionReusableView.self, forSupplementaryViewOfKind: RBCollectionViewInfoFolderFooterKind, withReuseIdentifier: "footer")
    cview.registerClass(collectionViewFolder.self, forSupplementaryViewOfKind: RBCollectionViewInfoFolderFolderKind, withReuseIdentifier: "folder")
    cview.registerClass(RBCollectionViewInfoFolderDimple.self, forSupplementaryViewOfKind: RBCollectionViewInfoFolderDimpleKind, withReuseIdentifier: "dimple")


    ArtistCollectionView.collectionViewLayout = lay
    ArtistCollectionView.registerNib(nib, forCellWithReuseIdentifier: "item")
    ArtistCollectionView.dataSource = self
    ArtistCollectionView.delegate = self

    PlaylistCollectionView.collectionViewLayout = layout
    PlaylistCollectionView.registerNib(nib, forCellWithReuseIdentifier: "item")
    PlaylistCollectionView.dataSource = self

    AlbumCollectionView.collectionViewLayout = layout
    AlbumCollectionView.registerNib(nib, forCellWithReuseIdentifier: "item")
    AlbumCollectionView.dataSource = self
}

My CustomCollectionViewFlowlooks like this

class CustomCollectionViewFlow: UICollectionViewFlowLayout{
override init(){
    super.init()
    setupLayout()
}

required init?(coder aDecoder: NSCoder){
    super.init(coder: aDecoder)
    setupLayout()
}

override var itemSize: CGSize {
    set {

    }
    get {
        let numberOfColumns: CGFloat = 3

        let itemWidth = (CGRectGetWidth(self.collectionView!.frame) - (numberOfColumns - 1)) / numberOfColumns
        return CGSizeMake(itemWidth, itemWidth)
    }
}

func setupLayout() {
    minimumInteritemSpacing = 0
    minimumLineSpacing = 0
    scrollDirection = .Vertical
}

}

I will keep all my encoding here, as it will become a large post, and other methods are currently irrelevant. However, I made this example application, which I made for this on git here for those who want to test it.

This image shows how the state of my collection view was before I implemented rbcollectionview. The second image shows what I'm trying to achieve.

enter image description here

Here's what the view should look like when you select an item

enter image description here

EDIT

. , . , , rbcollectionviewinfofolderlayout. , , , . . , . , .

,

class RBCollectionLayout: RBCollectionViewInfoFolderLayout
{
    var view: UIView!
    init(view: UIView){
        super.init()
        self.view = view
        setupLayout()
    }

override init(){
    super.init()
    setupLayout()
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    setupLayout()
}

func setupLayout(){
    let numberofItems: CGFloat = 3

    let itemWidth = (CGRectGetWidth(view.frame)) / numberofItems
    cellSize = CGSizeMake(itemWidth, itemWidth)

    interItemSpacingX = 0
    interItemSpacingY = 0
}
}

,

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

    if(view_artist.hidden == false){
        guard let ArtistFlowLayout = ArtistCollectionView.collectionViewLayout as? RBCollectionViewInfoFolderLayout else {
            return
        }
        lay = RBCollectionLayout(view: self.view)
        ArtistCollectionView.collectionViewLayout = lay
        ArtistFlowLayout.invalidateLayout()
    }
}

viewdidload

lay = RBCollectionLayout(view: self.view)
ArtistCollectionView.collectionViewLayout = lay

git

+4
1

, , , , , , , - .

, , collectionView:viewForSupplementaryElementOfKind:atIndexPath:, CollectionView, . GitHub Repo , , 4 , . , , RBCollectionViewInfoFolderFolderKind. .

, , , , .

0

Source: https://habr.com/ru/post/1628508/


All Articles