web-dev-qa-db-ja.com

UITableView iOS6の下部にあるUIRefreshControl?

UIRefreshControlの下部にUITableViewを追加することは可能ですか?私はそれを使用してより多くのデータをロードします。お願いします、何か提案はありますか?

28
Dany

この問題に対する簡単な解決策はないと思います。誰かがこの動作を実装するために別のライブラリを作成する可能性があります。さらに、データをtableviewにキャッシュすると、さらに複雑になります。

しかし、問題を分解してみましょう。それはあなたが望むものを達成するのに役立つかもしれません。次のコードを使用して、アプリに行を追加しました。

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    float endScrolling = scrollView.contentOffset.y + scrollView.frame.size.height;
    if (endScrolling >= scrollView.contentSize.height)
    {
        NSLog(@"Scroll End Called");
        [self fetchMoreEntries];
    }
}

またはあなたはそのようなことをすることができます:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if ((scrollView.contentOffset.y + scrollView.frame.size.height) >= scrollView.contentSize.height)
    {
        if (!self.isMoreData)
        {
            self.MoreData = YES;

            // call some method that handles more rows
        }
    }
}

私が上で説明したように、あなたは多くの質問でそのような方法を見たはずであり、確かにあなたが求めたものではありません。しかし、あなたができることは、上記のコードがより多くのデータをロードする過程で、サブビューを追加して、UIRefreshControlが提供するものと同様の画像をいくつか表示することです。上記のコードが実行されるまで、進捗状況として表示されるようにサブビューに画像を追加します。これは役に立ちます。

ちなみに、学習目的でやらない限り、何かを小さくするのに時間を浪費するだけなので、そうしないことをお勧めします。

29
Jessica

UIViewを使用して、下部のrefreshControlをカスタマイズできます。 UIViewを作成し、footerViewとしてUITableViewに追加します。

UIView* footerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 50)];

[footerView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"refreshImage.png"]]];

tableView.tableFooterView = footerView;

非表示にする:tableView.tableFooterView.hidden = YES;

UIScrollViewデリゲートを実装する-

(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if ((scrollView.contentOffset.y + scrollView.frame.size.height) >= scrollView.contentSize.height)
    {
             tableView.tableFooterView.hidden = NO;
            // call method to add data to tableView
    }

}

tableViewにデータを追加する前に、現在のオフセットをCGPoint offset = tableView.contentOffset;で保存します

reloadDataを呼び出してから、以前に保存したオフセットをtableView [tableView setContentOffset:offset animated:NO];に設定します。

下部に追加された新しいデータを感じることができるように。

10
Rahul Mane

私は最近同じ問題に悩まされており、UIScrollViewクラスのカテゴリを記述しています。これは CCBottomRefreshControl です。

8
morbo

次の答えはXcode 8とSwift 3。

最初に宣言する

var spinner = UIActivityIndicatorView()

viewDidLoadメソッドよりも次のコードを記述します。

spinner = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge)
spinner.stopAnimating()
spinner.hidesWhenStopped = true
spinner.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: 60)
tableView.tableFooterView = spinner

最後にoverridescrollViewDidEndDraggingデリゲートメソッドを次のように追加します。

override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        let offset = scrollView.contentOffset
        let bounds = scrollView.bounds
        let size = scrollView.contentSize
        let inset = scrollView.contentInset

        let y = offset.y + bounds.size.height - inset.bottom
        let h = size.height

        let reloadDistance = CGFloat(30.0)
        if y > h + reloadDistance {
            print("fetch more data")
            spinner.startAnimating()
        }
}

実際、無料のSensible TableViewフレームワークは、この機能をそのまま使用できます。バッチ番号を指定すると、データが自動的にフェッチされ、最後のセルが「さらに読み込む」セルとして表示されます。そのセルをクリックすると、次のバッチが自動的に読み込まれます。見てみる価値があります。

4
Matt

UITableViewについては、次のアプローチをお勧めします。

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{    
    // if this is the last row that we have in local data
    // and we didn't reach the total count of rows from the server side
    if (count == indexPath.row+1 && count < total)
    {
        // .. fetch more rows and reload table when data comes
    }
}

スクロールビューが遅いため、意図的にスクロールビューのメソッドを使用していません。スクロールビューがスクロールし、より多くのデータを要求し、より多くの行を更新し、スクロールビューがスクロールでまだ終了しておらず、減速していて、より多くのデータのフェッチで問題が発生している場合があります。

2
Prcela

このSwiftライブラリでは、UITableviewの下部にプルを追加して更新します。

https://github.com/marwendoukh/PullUpToRefresh-iOS

これがお役に立てば幸いです。

ココアポッドでCCBottomRefreshControlを使用します。

言語の目的のためです。あなたはあなたのSwiftプロジェクトにポッドファイルを追加してそれを実行することができます、私はそれをやった、私にとって問題は発生しません

それが役に立てば幸い。

0
Abuzar Manzoor