iosobjective-cuitableviewpaginationuisegmentedcontrol

How to make pagination with UITableView along with UISegmentedControl


My view controller has a UISegmentedControl with 6 buttons/segment. It also has a UITableView under that Segmented Control. If we switch segment by click then table view is reloading with different data. Now we are trying to implement a way where if user swipe the table view either in left-to-right or right-to-left, a pagination like behaviour will be appeared in the view controller.

Means the table view will horizontally scrolled along with segmented control. How can we implement this feature in my app in best approach ? My table has three different custom cell, one of which also has a UICollectionView inside the cell.


Solution

  • The idea I would suggest is to use tableView inside collectionView. Steps to follow-:

    1) Add segmentedControl and collectionView on your controller.

    2) Connect dataSource and delegate by control dragging from collectionView to controller yello icon.

    3) Adjust your cell height.

    4) Select collectionView, and go to attribute inspector. Look for-: 1) scroll direction and make horizontal. 2) Check Paging Enabled parameter.

    5) Apply Constraints on views.

    6) Give collectionView cell identifier.

    7) Give your cell a custom collectionView cell class.

    8) Connect all Outlets to respected views.

    Controller class -:

    import UIKit
    
    class ViewController: UIViewController {
    
        // OUTLETS
        @IBOutlet weak var controls: UISegmentedControl!
        @IBOutlet weak var horizontalCollectionView: UICollectionView!
    
        // ARRAy OF TYPE UICOLOR
        var collectionViewColors = [UIColor.gray,UIColor.green,UIColor.red,UIColor.yellow,UIColor.blue,UIColor.brown]
    
        // ViewDidLoad
        override func viewDidLoad() {
            super.viewDidLoad()
    
        }
        //didReceiveMemoryWarning
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
        // Function to calculate cell index on scroll end.
        func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>){
            let pagingIndex = targetContentOffset.pointee.x/self.view.frame.width
            // Set segmented controll current index
            controls.selectedSegmentIndex = Int(pagingIndex)
        }
    
    }
    
    // Collection view methods
    
    extension ViewController : UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout{
        // number of section
        func numberOfSections(in collectionView: UICollectionView) -> Int {
            return 1
        }
        // number of items in section
        func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
            return collectionViewColors.count
        }
        // deque cell
        func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collection", for: indexPath) as! HorizontalCell
            cell.horizonatlColorsView.backgroundColor = collectionViewColors[indexPath.item]
            return cell
        }
        // set minimum line spacing to zero.
        func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
            return 0
        }
    }
    

    Custom cell class-:

    import UIKit
    
        class HorizontalCell: UICollectionViewCell {
            // UIView outlet
            @IBOutlet weak var horizonatlColorsView: UIView!
        }
    

    After setting up everything , scroll horizontally you will get the output you want.Also you can add tableView inside collectionView now.

    Output-:

    enter image description here

    enter image description here