Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UICollectionView with full page cells VS UIScrollView with child view controllers

I'm trying to create a ViewController which would have swipe-able (android like tabs) pages. These pages themselves will have scrollviews(vertical) inside them and multiple views which would be added dynamically depending on type of response (different network calls for each page). I can't use a PageViewController as I want the pages to take up only half the screen.

Issues with CollectionView -

  • If the cells would get reused (or removed from memory), how would I maintain the state of the cell's UI and store that data (especially difficult for views as each page might have different type of view in them)

Issues with ScrollView -

  • I'm worried if there would be memory issues if all page view controllers would be in memory with each view in it

PS - data in each page would be 4-10 stackviews each containing 2-10 images/labels OR just one collectionview

PSS - Total number of tabs wouldn't exceed 10, minimum would be 1

like image 397
Akash Popat Avatar asked Jul 26 '18 06:07

Akash Popat


1 Answers

I'd implemented it with collectionView cause it should be really more resource effective. But then we need to cache states of view controllers. Here is the example

Let's say you have controller A which contains collectionView with cell with your child controllers. Then in cell for row

....
var childrenVC: [Int: UIViewController] = [:]
....
// cell for row
let cell: ChildControllerCell = collectionView.dequeueReusableCell(for: indexPath)
if let childController = childrenVC[indexPath.row] {
   cell.contentView.addSubview(childController.view)
   childController.view.frame = cell.contentView.frame
} else {
   let childViewController = ChildViewController()
   addChildViewController(childViewController)
   childViewController.didMove(toParentViewController: self)
   cell.contentView.addSubview(childController.view)
   childController.view.frame = cell.contentView.frame
   childrenVC[indexPath.row] = childViewController
   cell.childVC = childViewController
}
return cell
....
class ChildControllerCell: UICollectionViewCell {
     var childVC: UIViewController?
     override func prepareForReuse() {
        super.prepareForReuse()
        if !contentView.subviews.isEmpty {
            childVC?.willMove(toParentViewController: nil)
            childVC?.view.removeFromSuperview()
            childVC?.removeFromParentViewController()
        }
    }
}
like image 55
Mikhail Maslo Avatar answered Nov 17 '22 13:11

Mikhail Maslo