【问题标题】:How to use rbcollectionviewinfofolderlayout with custom UICollectionViewCell & CollectionViewLayout如何将 rbcollectionviewinfofolderlayout 与自定义 UICollectionViewCell 和 CollectionViewLayout 一起使用
【发布时间】:2016-02-12 13:24:35
【问题描述】:

在选择该单元格时,我要做的是在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 here 上,供任何想要查看它的人使用。

这张图片显示了在我实现 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 here

上可用

【问题讨论】:

    标签: ios swift uicollectionview uicollectionviewcell


    【解决方案1】:

    嗯,我可能是唯一可以回答你问题的人,因为我编写了这个控件,我怀疑其他人实际上在使用它。

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

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

    【讨论】:

    • 我确实实现了该方法。我会看看它,看看是否能解决它,但我有我的怀疑。该死的,我一定是忘记推送到 git 了。我也会这样做
    • 我只是将代码推送到我的 git。如果可以的话,请再看一遍,因为我怀疑你的建议对我没有帮助
    • 我刚刚再次更新了我的 git。我能够像以前在我的布局流中一样创建布局。我有一个错误,当文件夹被点击时它会折叠起来。当文件夹比屏幕大时,它看起来像错误。我也编辑了我的问题。
    猜你喜欢
    • 2013-02-17
    • 1970-01-01
    • 2017-11-09
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多