ios - 如何将 rbcollectionviewinfofolderlayout 与自定义 UICollectionViewCell 和 CollectionViewLayout 一起使用

标签 ios swift uicollectionview uicollectionviewcell

我想要做的是在选中此单元格时在 UICollectionViewCell 中显示一个 UICollectionView。我想用 rbcollectionviewinfofolderlayout展开我的收藏 View 并在其中显示一个新的收藏 View 。但是我不确定如何将它实现到我现有的代码中。我在一个 View 中有三个 Collection View 。我根据用户所做的选择隐藏和取消隐藏我的 View 。我为我的 Collection View 中的单元格使用了自定义单元格 xib,并且我有一个自定义的 collectionviewflowlayout,确保始终有 3 个单元格显示在设备的宽度上。

这就是我的 View Controller 的样子。

在我的 viewDidLoad 中,我必须将 RBCollectionViewInfoFolderLayout 设置为我的 Collection View 。如您所见,布局变量包含我的 CustomCollectionViewFlow,我在实现 RBCollectionviewinfofolderlayout 之前将其设置为 Collection View 布局。

    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 here 上。对于任何想要查看的人。

这张图片显示了在我实现 rbcollectionview 之前我的 collectionview 的状态。第二张图片显示了我正在努力实现的目标

enter image description here

这是点击项目时 View 的外观

enter image description here

编辑

我已经能够让它正常工作了。我能够显示我想要的布局。就像我在实现 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 上可用 here

最佳答案

好吧,我可能是唯一可以回答您问题的人,因为我编写了这个控件并且我怀疑其他人是否真的在使用它。

您似乎缺少一个关键组件,即委托(delegate)方法 collectionView:viewForSupplementaryElementOfKind:atIndexPath:,您可以在其中告诉 CollectionView 对各种元素使用哪些 View 。如果你去GitHub Repo并查看示例,您将看到在该方法中我根据请求的 viewKind 返回 4 个不同的 View 。在您的代码中,我相信您想要做的是为 RBCollectionViewInfoFolderFolderKind 返回基于自定义流布局的 Collection View 。这会将您的 3 单元格流布局 View 放入所选单元格的展开文件夹中。

我克隆了您的存储库,但它似乎不是您在此处显示的代码的最新版本。

关于ios - 如何将 rbcollectionviewinfofolderlayout 与自定义 UICollectionViewCell 和 CollectionViewLayout 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35363762/

相关文章:

ios - 想要将一些代码应用到同一个 Storyboard 上的第二个场景(Xcode、Swift 2)

c# - Xamarin IOS : How to display a popup control from button click

ios - 解析查询 .whereKey

swift - 私有(private)集类及其方法 Swift 4

objective-c - 通过选择以编程方式创建的 collectionView 的 Cell 切换到另一个 ViewController

swift - 当 UISearchController 聚焦时重置 UIView

ios - core data中的transient, indexed, index spotlight和store in external Record file是什么?

ios - 为什么文本框的边缘会被剪掉?

iOS 将 ARSCNView 推送到 UINavigationController 并从中返回

ios - 将 Touches 从 ScrollView 传递到下面的 CollectionView