繁体   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