UICollectionViewCell 中的 UICollectionView (Swift)
UICollectionView within a UICollectionViewCell (Swift)
我正在尝试在每个可重复使用的 UICollectionViewCell
中放置一个 UICollectionView
。 Ash Furrow 方法对我来说效果不太好,因为使用一个 UICollectionViewController
class 作为数据源和两个 UICollectionViews
的委托不起作用。
我最新的方法是在每个单元格中放置一个 UICollectionViewController
的视图,如 this question and this doc 中所述。但是,当我尝试加载视图时,我的应用程序冻结了。在 Xcode 调试导航器中,CPU 处于恒定的 107%,几秒钟后内存接近 1GB。
在这个例子中,我试图在每个 MainCollectionViewControllerCell
中得到一个 ThumbnailCollectionViewController
。每个 ThumbnailCollectionViewControllerCell
中唯一的东西是一张尺寸为 50x50 的图像。
这是如何正确完成的?
在 MainCollectionViewController
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! UICollectionViewCell
let thumbsViewController = self.storyboard?.instantiateViewControllerWithIdentifier("ThumbnailColllection") as! ThumbnailCollectionViewController
self.addChildViewController(thumbsViewController)
thumbsViewController.view.frame = cell.bounds
cell.addSubview(thumbsViewController.view)
thumbsViewController.didMoveToParentViewController(self)
}
ThumbnailCollectionViewController
let reuseIdentifier = "ThumbCell"
let thumbnails = ["red", "green", "blue"]
override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return thumbnails.count
}
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! UICollectionViewCell
let cellImage = UIImage(named: thumbnails[indexPath.row])
let cellImageView = UIImageView(image: cellImage)
cellImageView.frame = cell.bounds
cell.addSubview(cellImageView)
return cell
}
您在每个单元格中放置 UICollectionView
的方法看起来不错,但您很可能会看到糟糕的性能,因为您对单元格重用处理不当。每次请求新的可重用单元格时,您都会向单元格添加一个新的集合视图(实际上,每个缩略图单元格都会添加一个新的图像视图)。如果您连续滚动,那么 已经 添加了这些子视图的单元格将会出列,因此您最终会在每个单元格下得到许多子视图。
相反,添加一种方法来检查单元格是否已经有子视图,并且只有在没有时才添加它。可能最好的方法是使用自定义单元格子类:
class ThumbnailCollectionCell: UICollectionViewCell {
var thumbnailViewController: ThumbnailCollectionViewController?
}
回到您的 MainCollectionViewController:
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! ThumbnailCollectionCell
if cell.thumbnailViewController == nil {
let thumbsViewController = self.storyboard?.instantiateViewControllerWithIdentifier("ThumbnailColllection") as! ThumbnailCollectionViewController
self.addChildViewController(thumbsViewController)
thumbsViewController.view.frame = cell.bounds
cell.addSubview(thumbsViewController.view)
thumbsViewController.didMoveToParentViewController(self)
cell.thumbnailViewController = thumbsViewController
}
}
同样,类似的东西可以防止多个 UIImageView
被添加到每个缩略图单元格。
我正在尝试在每个可重复使用的 UICollectionViewCell
中放置一个 UICollectionView
。 Ash Furrow 方法对我来说效果不太好,因为使用一个 UICollectionViewController
class 作为数据源和两个 UICollectionViews
的委托不起作用。
我最新的方法是在每个单元格中放置一个 UICollectionViewController
的视图,如 this question and this doc 中所述。但是,当我尝试加载视图时,我的应用程序冻结了。在 Xcode 调试导航器中,CPU 处于恒定的 107%,几秒钟后内存接近 1GB。
在这个例子中,我试图在每个 MainCollectionViewControllerCell
中得到一个 ThumbnailCollectionViewController
。每个 ThumbnailCollectionViewControllerCell
中唯一的东西是一张尺寸为 50x50 的图像。
这是如何正确完成的?
在 MainCollectionViewController
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! UICollectionViewCell
let thumbsViewController = self.storyboard?.instantiateViewControllerWithIdentifier("ThumbnailColllection") as! ThumbnailCollectionViewController
self.addChildViewController(thumbsViewController)
thumbsViewController.view.frame = cell.bounds
cell.addSubview(thumbsViewController.view)
thumbsViewController.didMoveToParentViewController(self)
}
ThumbnailCollectionViewController
let reuseIdentifier = "ThumbCell"
let thumbnails = ["red", "green", "blue"]
override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return thumbnails.count
}
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! UICollectionViewCell
let cellImage = UIImage(named: thumbnails[indexPath.row])
let cellImageView = UIImageView(image: cellImage)
cellImageView.frame = cell.bounds
cell.addSubview(cellImageView)
return cell
}
您在每个单元格中放置 UICollectionView
的方法看起来不错,但您很可能会看到糟糕的性能,因为您对单元格重用处理不当。每次请求新的可重用单元格时,您都会向单元格添加一个新的集合视图(实际上,每个缩略图单元格都会添加一个新的图像视图)。如果您连续滚动,那么 已经 添加了这些子视图的单元格将会出列,因此您最终会在每个单元格下得到许多子视图。
相反,添加一种方法来检查单元格是否已经有子视图,并且只有在没有时才添加它。可能最好的方法是使用自定义单元格子类:
class ThumbnailCollectionCell: UICollectionViewCell {
var thumbnailViewController: ThumbnailCollectionViewController?
}
回到您的 MainCollectionViewController:
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! ThumbnailCollectionCell
if cell.thumbnailViewController == nil {
let thumbsViewController = self.storyboard?.instantiateViewControllerWithIdentifier("ThumbnailColllection") as! ThumbnailCollectionViewController
self.addChildViewController(thumbsViewController)
thumbsViewController.view.frame = cell.bounds
cell.addSubview(thumbsViewController.view)
thumbsViewController.didMoveToParentViewController(self)
cell.thumbnailViewController = thumbsViewController
}
}
同样,类似的东西可以防止多个 UIImageView
被添加到每个缩略图单元格。