我打算在单个tableView Cell中使用多个collectionView。
我真正想要的是以这种方式显示专辑照片(UI非常重要)。见图:
如何制作这个UI?
直到现在我已经拿了一个TableView - > TableCell(Single) - > 3个不同的集合查看单元格。
代码:
CustomGalleryController
class CustomGalleryController: UIViewController {
var arrayOfPHAsset = [PHAsset]()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
CustomAlbum().fetchCustomAlbumPhotos { (array) in
self.arrayOfPHAsset = array
CustomGalleryTableCell().firstCollectionArray = array
CustomGalleryTableCell().secondCollectionArray = array
CustomGalleryTableCell().thirdCollectionArray = array
//self.collectionView.reloadData()
}
}
extension CustomGalleryController : UITableViewDelegate{
}
extension CustomGalleryController : UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "CustomGalleryTableCell", for: indexPath) as! CustomGalleryTableCell
return cell
}
}
CustomGalleryTableCell
class CustomGalleryTableCell: UITableViewCell {
@IBOutlet var firstCollectionView: UICollectionView!
@IBOutlet var secondCollectionView: UICollectionView!
@IBOutlet var thirdCollectionView: UICollectionView!
var firstCollectionArray = [PHAsset]()
var secondCollectionArray = [PHAsset]()
var thirdCollectionArray = [PHAsset]()
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
extension CustomGalleryTableCell : UICollectionViewDataSource{
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
// if collectionView == firstCollectionView {
// return 1;//firstCollectionArray.count
// }else if collectionView == secondCollectionView {
// return 1;//secondCollectionArray.count
// }else{
// return 1;//thirdCollectionArray.count
// }
return 1
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
if collectionView == firstCollectionView {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "FirstCollectionCell", for: indexPath) as! FirstCollectionCell
return cell
}else if collectionView == secondCollectionView {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SecondCollectionCell", for: indexPath) as! SecondCollectionCell
return cell
}else{
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ThirdCollectionCell", for: indexPath) as! ThirdCollectionCell
return cell
}
}
}
但是崩溃了:
因未捕获的异常而终止应用程序NSInvalidArgumentException', 原因:' - [UITableView collectionView:numberOfItemsInSection:]: 无法识别的选择器发送到实例0x1049ed600
po 0x1049ed600
给出:
<UITableView: 0x1049ed600; frame = (0 0; 414 736); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x17424b550>;
layer =; contentOffset:{0,0}; contentSize: {414,44}&gt;
答案 0 :(得分:1)
使用CHTCollectionViewWaterfallLayout生成的 chiahsien 可以实现这一点。我已经使用过这个库了,我必须说它的工作真的很棒。
您可以使用pod安装它:
/classes/db/Db.php
可以找到Swift中的演示 here 。
与此示例唯一不同的是,您在顶部的每一列上都有一定的填充,但我确信这也是可以实现的。
答案 1 :(得分:1)
请建议任何其他好方法来实现此UI?
如果您的目标是实现屏幕截图中提到的内容,则无需将其实现为包含集合视图的tableview,而是使用UICollectionViewLayout的直接方式。
作为提示,为了节省一些时间和精力,您可以找到一个可以为您完成工作的库,例如:
或者如果您有兴趣重新排序这些项目:
答案 2 :(得分:0)
初学者使用swift和Xcode。我一直在寻找一个解决方案,在一个TableViewCell中填充两个CollectionView。即使这可能不适合您的情况,您的问题的标题也符合:-)最后通过在故事板中使用tag属性来设法完成。
我是这样做的:
在ViewControllerDataSource中,使用if语句检查它是否是正确的CollectionView,并返回所需的任何内容(numberOfItemsInSection,cellForItemAt)。
extension ViewController: UICollectionViewDataSource {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
if collectionView.tag == 0 {
return imageArray1.count
} else {
return imageArray2.count
}
}
}
希望这有帮助!