簡體   English   中英

如何在自定義UICollectionViewCell和CollectionViewLayout中使用rbcollectionviewinfofolderlayout

[英]How to use rbcollectionviewinfofolderlayout with custom UICollectionViewCell & CollectionViewLayout

我想要做的是在選擇此單元格時在UICollectionViewCell內顯示UICollectionView。 我想使用rbcollectionviewinfofolderlayout來折疊我的集合視圖並在其中顯示一個新的集合視圖。 但是,我不確定如何將其實現到現有代碼中。 我在一個視圖中有三個集合視圖。 我根據用戶的選擇隱藏和取消隱藏我的觀點。 我為集合視圖中的單元格使用自定義單元格xib,並且我有一個自定義collectionviewflowlayout,確保在設備的寬度中始終顯示3個單元格。

這就是我的視圖控制器的樣子。

在我的viewDidLoad中,我必須將RBCollectionViewInfoFolderLayout設置為我的collectionview。 正如您所看到的,布局變量包含我的CustomCollectionViewFlow ,我在實現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
}

我的CustomCollectionViewFlow看起來像這樣

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
}

}

我將把所有編碼放在這里,因為它將成為一個大的帖子,其他方法在這一點上是無關緊要的。 然而,我所做的是將我為此制作的示例應用程序放在git上以供任何想要查看它的人使用。

在我實現rbcollectionview之前,此圖顯示了我的collectionview的狀態。 第二張圖顯示了我想要實現的目標

在此輸入圖像描述

這是查看項目時視圖的外觀

在此輸入圖像描述

編輯

我已經能夠讓它工作了。 我能夠像我想要的那樣展示布局。 就像我在實現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 在這里再次提供所有代碼

好吧,我可能是唯一可以回答你問題的人,因為我寫了這個控件,我懷疑其他人是否真的在使用它。

您似乎缺少一個關鍵組件,它是委托方法collectionView:viewForSupplementaryElementOfKind:atIndexPath:您告訴CollectionView哪些視圖用於各種元素。 如果您轉到GitHub Repo並查看示例,您將看到在該方法中,我將返回4個不同的視圖,具體取決於所要求的viewKind。 在您的代碼中,我相信您要做的是返回RBCollectionViewInfoFolderFolderKind基於自定義流布局的集合視圖。 這會將您的3單元格流布局視圖放入所選單元格的展開文件夾中。

我克隆了您的回購,但它似乎與您在此處顯示的代碼保持同步。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM