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.
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.
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
}
}
}
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.
}
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.
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.
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 { }
}
- 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
}
}
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:)