gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 21:48:02 24 4
gpt4 key购买 nike

我想要做的是在选中此单元格时在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com