web-dev-qa-db-ja.com

UICollectionViewでページネーションを迅速に追加する方法は?

アイテムを表示するUICollectionビューがあります。次に、UICollectionViewにページ分割を追加します。この機能のためにサードパーティを使用したくありません。これを達成する方法を教えてください!

私には4つの例があります http://slicode.com/bottom-refresh-control-uicollectionview/

しかし、この場合、スクロールビューを数秒間上方向にドラッグして機能させる必要があります。

5
TechChain

下部のリフレッシュコントロールを追加する場合は、ヘルパークラスの下を使用する必要があります。

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

Objective-Cにあるこの2つのファイルをダウンロードします。このファイルをブリッジヘッダーにインポートする必要があります

#import "UIScrollView+BottomRefreshControl.h"

このような更新コントロールを追加します。

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

このヘルパークラスは、新しいbottomRefreshControlプロパティを提供します。これは、下部に更新コントロールを追加するのに役立ちます。

2
Jaydeep

アプリケーションの1つにロード機能を追加したので、コードを紹介します

    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

それを行う簡単な方法

 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 {
            isPageRefreshing = true
            print(page)
            page = page + 1
            YourApi(page1: page)
        }
    }
}

あなたのAPIメソッドで

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

それでおしまい。

1
Ketan Odedra

CollectionView Delegateメソッド: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

私はページネーションをしながらそのコードを使用しました。ポイントは;コレクションビューの読み込み中に読み込まれたセルインデックスをキャッチし、そのmodを数値で制御し、APIのページサイズフィールド(ある場合)でデータを個別にフェッチします。この数よりも小さい数を決定し、それを制御することができます。

たとえば、5つのデータをフェッチしてロードし、この状態がOKであれば、他の5つのデータをフェッチします。これがそのサンプルコードです。

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()

                            }
                        }
                    }
                }
            }
        }
    }

このコードでは、indexpath.row%3 == 1かどうかを制御しています。少し複雑になる可能性があるため、必要に応じてコードブロックを共有できます。幸運を:)

1
Cemal BAYRI

うまくいくか試してみてください。

ステップ1:

グローバル変数を宣言します。

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

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!)

ステップ2:api呼び出しメソッドに値を設定します。

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

ステップ3:このコードを書く:

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
    }
}

サービスコールでは、ページインデックスを送信し、サーバーエンドから応答を返すことができます。

ありがとうございました。

1
Sanjukta

willDisplay cellメソッド呼び出しのコードは、スクロールが最後から5セル離れている間、より多くの関数をロードします。データのフェッチ中に、ローダーをコレクションビューのフッターに表示します。ロードが完了したらフッターを非表示にします。

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-データ配列。

-pageCount-ページ数の追跡に使用される変数。

-totalCount-データの総数

--- APIを呼び出すたびにitemListにデータを追加します。

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