UIRefreshControl
の下部にUITableView
を追加することは可能ですか?私はそれを使用してより多くのデータをロードします。お願いします、何か提案はありますか?
この問題に対する簡単な解決策はないと思います。誰かがこの動作を実装するために別のライブラリを作成する可能性があります。さらに、データを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が提供するものと同様の画像をいくつか表示することです。上記のコードが実行されるまで、進捗状況として表示されるようにサブビューに画像を追加します。これは役に立ちます。
ちなみに、学習目的でやらない限り、何かを小さくするのに時間を浪費するだけなので、そうしないことをお勧めします。
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];
に設定します。
下部に追加された新しいデータを感じることができるように。
私は最近同じ問題に悩まされており、UIScrollViewクラスのカテゴリを記述しています。これは CCBottomRefreshControl です。
次の答えは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
最後にoverride
scrollViewDidEndDragging
デリゲートメソッドを次のように追加します。
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フレームワークは、この機能をそのまま使用できます。バッチ番号を指定すると、データが自動的にフェッチされ、最後のセルが「さらに読み込む」セルとして表示されます。そのセルをクリックすると、次のバッチが自動的に読み込まれます。見てみる価値があります。
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
}
}
スクロールビューが遅いため、意図的にスクロールビューのメソッドを使用していません。スクロールビューがスクロールし、より多くのデータを要求し、より多くの行を更新し、スクロールビューがスクロールでまだ終了しておらず、減速していて、より多くのデータのフェッチで問題が発生している場合があります。
このSwiftライブラリでは、UITableview
の下部にプルを追加して更新します。
https://github.com/marwendoukh/PullUpToRefresh-iOS
これがお役に立てば幸いです。
ココアポッドでCCBottomRefreshControlを使用します。
言語の目的のためです。あなたはあなたのSwiftプロジェクトにポッドファイルを追加してそれを実行することができます、私はそれをやった、私にとって問題は発生しません
それが役に立てば幸い。