web-dev-qa-db-fra.com

Comment ajouter de la pagination dans UICollectionView dans swift?

J'ai une vue UICollection qui montre des éléments. Maintenant, je veux ajouter une pagination sur UICollectionView. Je ne souhaite utiliser aucun tiers pour cette fonctionnalité. S'il vous plaît laissez-moi savoir comment je peux y parvenir!

J'ai quatre un exemple http://slicode.com/bottom-refresh-control-uicollectionview/

Mais pour cela, je dois faire glisser scrollview vers le haut pendant quelques secondes pour que cela fonctionne. 

3
Dhiraj Kumar

Si vous souhaitez ajouter un contrôle d'actualisation par le bas, vous devez utiliser la classe d'assistance ci-dessous.

https://github.com/vlasov/CCBottomRefreshControl/tree/master/Classes

Téléchargez ces 2 fichiers qui sont en Objective-C. Vous devez importer ce fichier dans l'en-tête Bridging

#import "UIScrollView+BottomRefreshControl.h"

Ajoutez le contrôle de rafraîchissement comme ceci.

let refreshControl = UIRefreshControl.init(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
refreshControl.triggerVerticalOffset = 50.0 
refreshControl.addTarget(self, action: #selector(paginateMore), for: .valueChanged) 
collectionView.bottomRefreshControl = refreshControl

Cette classe d'assistance vous fournit la nouvelle propriété bottomRefreshControl, qui vous aide à ajouter un contrôle d'actualisation en bas.

2
Jaydeep

J'ai ajouté la fonctionnalité de chargement plus dans une de mes applications alors laissez-moi vous donner le code

    func collectionView(_ collectionView: UICollectionView, layout
        collectionViewLayout: UICollectionViewLayout,
                        referenceSizeForFooterInSection section: Int) -> CGSize {

        if arrData.count > 0 && isLastPageReached == false
        {
            return CGSize(width:(collectionView.frame.size.width), height: 100.0)
        }
        return CGSize.zero

    }
    func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {

        if kind == UICollectionElementKindSectionFooter {

            let vew = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionFooter, withReuseIdentifier: "footer", for: indexPath)


            let loading = UIActivityIndicatorView()
            loading.activityIndicatorViewStyle = .gray
            loading.translatesAutoresizingMaskIntoConstraints = false
            loading.tintColor = UIColor.gray
            loading.tag = -123456
            vew.addSubview(loading)
            vew.addConstraint(NSLayoutConstraint(item: loading, attribute: .centerX, relatedBy: .equal, toItem: vew, attribute: .centerX, multiplier: 1, constant: 0))
            vew.addConstraint(NSLayoutConstraint(item: loading, attribute: .centerY, relatedBy: .equal, toItem: vew, attribute: .centerY, multiplier: 1, constant: 0))


            return vew
        }
        return UICollectionReusableView()
    }

    func collectionView(_ collectionView: UICollectionView, willDisplaySupplementaryView view: UICollectionReusableView, forElementKind elementKind: String, at indexPath: IndexPath) {
        if elementKind == UICollectionElementKindSectionFooter {

            if let loadingView = view.viewWithTag(-123456) as? UIActivityIndicatorView{
                if arrData.count > 0 && isLastPageReached == false 
                {
                    loadingView.startAnimating()
                    self.loadMore()
                }
                else
                {
                    self.isLoadMore = false
                }
            }
        }
    }
    func collectionView(_ collectionView: UICollectionView, didEndDisplayingSupplementaryView view: UICollectionReusableView, forElementOfKind elementKind: String, at indexPath: IndexPath) {
        if elementKind == UICollectionElementKindSectionFooter{

            if let loadingView = view.viewWithTag(-123456) as? UIActivityIndicatorView{
                loadingView.stopAnimating()
                loadingView.removeFromSuperview()

                self.isLoadMore = false
            }

        }
    }
2
chirag shah

Méthode CollectionView Delegate: Chargez plus de données sur la demande de défilement sur CollectionView.

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
        if indexPath.row == numberofitem.count - 1 {  //numberofitem count
            updateNextSet()  
        }
}

func updateNextSet(){
       print("On Completetion")
       //requests another set of data (20 more items) from the server.
}
1
Pranavan Sp

S'il vous plaît essayez cela cela fonctionne pour moi.

Étape 1:

Déclarer une variable globale:

var totalCount : NSInteger?
var isGetResponse : Bool = true
var activityIndiator : UIActivityIndicatorView?

Définissez le viewDidLoad:

activityIndiator = UIActivityIndicatorView(frame: CGRect(x: self.view.frame.midX - 15, y: self.view.frame.height - 140, width: 30, height: 30))
    activityIndiator?.activityIndicatorViewStyle = .white
    activityIndiator?.color = UIColor.black
    activityIndiator?.hidesWhenStopped = true
    activityIndiator?.backgroundColor = COLOR.COLOR_TABLEVIEW_BACKGROUND
    activityIndiator?.layer.cornerRadius = 15
    self.view.addSubview(activityIndiator!)
    self.view.bringSubview(toFront: activityIndiator!)

Étape 2: Définissez la valeur dans la méthode d'appel api:

self.totalCount = array.count
self.isGetResponse = true

Étape 3: Écrivez ce code:

func scrollViewDidScroll(_ scrollView: UIScrollView) {


if isGetResponse {
    if (scrollView.contentOffset.y == scrollView.contentSize.height - scrollView.frame.size.height)
    {
        if totalArrayCount! > self.arrProductListing.count{

                isGetResponse = false
                activityIndiator?.startAnimating()
                self.view.bringSubview(toFront: activityIndiator!)
                pageIndex = pageIndex + 1
                print(pageIndex)
                self.getProductListing(withPageCount: pageIndex)
            }
        }

        //LOAD MORE
        // you can also add a isLoading bool value for better dealing :D
    }
}

Dans un appel de service, vous pouvez envoyer l'index de page et, du serveur, ils renvoient la réponse. 

Je vous remercie.

1
Sanjukta

Moyen facile de le faire

 var page:Int = 0
 var isPageRefreshing:Bool = false

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    YourApi(page1: 0)
}

 func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if(self.mycollectionview.contentOffset.y >= (self.mycollectionview.contentSize.height - self.mycollectionview.bounds.size.height)) {
        if(isPageRefreshing==false) {
            isPageRefreshing=true
            print(page)
            page = page + 1
            YourApi(page1: page)
        }
    }
}

Dans vos méthodes api

func YourApi(page1 :Int) {
    let mypage = String(page1)
    let Request: String = String.init(format:"apiName/%@",mypage)
    print(Request)
}

C'est tout.

0
Ketan Odedra

Le code dans les appels de méthode willDisplay cell charge plus de fonctions pendant que votre défilement est à 5 cellules de la fin. Lors de la récupération des données, affichez le chargeur dans le pied de page de la vue Collection. Masquer le pied de page lorsque le chargement est terminé.

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {        
        let currentPage = collectionView.contentOffset.y / collectionView.frame.size.width;
        if (aryDataSource.count >= yourAPIResponsebatchCount && aryDataSource.count - indexPath.row == 5 && currentPage >= currentPage && isDataLoading) {
            currentPage++;
            self.fetchMoreData()
        }
        else { }
}
0
Naga Syam

- itemList - votre tableau de données.

- pageCount - variable utilisée pour garder trace du nombre de pages. 

- totalCount - nombre total de données 

--- ajoute des données à itemList chaque fois que vous appelez l'API.

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    if indexPath.row == itemList.count - 1 && itemList.count < totalCount{
        pageCount += 1
        // Call API here
    }
}
0
Shezad

J'ai utilisé ce code lors de la pagination. Le point est; attraper l'index de cellules chargé pendant le chargement de la vue de collection et contrôler son mod avec un nombre et extraire les données séparément avec le champ de taille de page dans l'api (le cas échéant). Vous pouvez décider quel nombre sera inférieur à ce calcul et vous le contrôlerez. 

Par exemple, vous avez récupéré 5 données et les avez chargées. Si cet état est correct, vous récupérez les 5 autres. Voici un exemple de code pour cela.

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        if let vc = self.parentViewController as? SellController {
            if vc.dontFetch == false {
                DispatchQueue.main.async {
                    if self.salesData.count > 3 {
                        if indexPath.row != 1 {
                            if indexPath.row % 3 == 1 {
                                print("indexpath: \(indexPath.row)")
                                vc.pagination += 1
                                vc.reload()

                            }
                        }
                    }
                }
            }
        }
    }

Dans ce code, je contrôle indexpath.row% 3 == 1 ou non. Cela peut être un peu complexe pour que je puisse partager un bloc de code si vous le souhaitez. Bonne chance:) 

0
Cemal BAYRI