2011-10-24 12 views
1

私は特別な読み込みをしているテーブルがあります。ユーザーは下にスクロールし始めます。ユーザーが上部近くをスクロールすると、スクロールビューのデリゲートメソッドによってこれが検出され、いくつかの追加コンテンツがすぐに読み込まれ、リストの上部の多くが読み込まれます。私はこれをシームレスに見せたい、「無限のスクロール」のように。これを行うには、コンテンツのオフセットを設定する必要があります。そのため、ユーザーはテーブルを「上に」ジャンプさせることはありません。ゆっくりとスクロールすると、これは完全に機能します。私がすばやくスクロールすると、テーブルが減速するので、私が設定したコンテンツオフセットは無視されます。私は減速している間、私は250ピクセル、たとえば、新しいテーブルの高さを取得し、より多くのデータをロードし、高いテーブル100pxにして素早くスクロールアップとトップを打つのであれば減速しているときに設定したコンテンツオフセットをUITableで上書きしないようにするにはどうすればよいですか?

CGFloat oldHeight = self.tableView.contentSize.height; 
CGFloat oldOffset = self.tableView.contentOffset.y; 
self.tableContentsArray = newTableContentsArray; 
[self.tableView reloadData]; 
CGFloat newHeight = self.tableView.contentSize.height; 
CGFloat newOffset = oldOffset + (newHeight - oldHeight); 
self.tableView.contentOffset = CGPointMake(0, newOffset); 

:ここで私が使用しているコードです。しかし、それはまだ減速しているので、アップルのコードはオフセットを0.1秒間150に設定した後、次に計算された減速オフセットに移動し、オフセットを0に設定します150pxのコンテンツをスキップしたように見えて、リストの新しいトップにいます。

今、私はリストからの加速を保つのが大好きです。それで、あなたは予想どおりに、しばらくの間上昇し、遅くなり、120pxのオフセットのどこかで終わるようにしたいと思います。質問は、どうですか?

[self.tableView setContentOffset: CGPointMake(0, newOffset) animated: NO];を使用すると、コンテンツのオフセットは無視されなくなりますが、リストは停止します。

答えて

2

私たちは数ヶ月後に仕事場でこのような面白い状況がありました。キャッシング、ロード、アニメーションのためにUITableViewControllerを使用したいと思っていましたが、水平方向にスクロールしていました(あなたの場合はスクロールします)。ソリューション?テーブルを回転させ、セルを反対方向に回転させます。あなたのケースでは

、コードは次のようになります。ヘッダー内

#define degreesToRadian(x) (M_PI * (x)/180.0)

- (void) viewDidLoad { 
    [super viewDidLoad]; 
    self.table.transform = CGAffineTransformMakeRotation(degreesToRadian(-180)); 
    ... 
} 

はその後、細胞を回転させ、それがユーザー

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    ... 
    cell.transform = CGAffineTransformMakeRotation(degreesToRadian(180)); 
} 
のために右の向きに表示されます。

これで、通常のテーブルのようにセルをポストすることができます。セルは底部の代わりに上に追加されます。

+0

本当にクールなソリューション!基本的にはUITableViewをハッキングしていますが、iOSを使用している私の経験から、あなたはいつも何かをハックする必要があると言うことができます:) – Sulthan

+0

作品は魅力的です –

0

本当に理解していないと複雑すぎることを心配していますか?

本当に有限のテーブルか非常に長いテーブルがありますか?私はそれが1000000細胞を持っているテーブルに伝えることが可能だろうと思う。必要に応じて各セルが読み込まれます。それは基本的にあなたがしたいことです。

+0

データは、高価なデータベースクエリから得られます。これは、チャンクでロードする必要があります。各セルには、データに基づくカスタム高さがあります。これにより、提案された解決策は実行不能になります。 –

+0

すべての行の高さが同じ場合、UITableは最高のパフォーマンス(および最高のルック・アンド・フィール)を備えています。あなたのUIを再考するか、UITableViewを完全に離れる方がよいでしょうか?とにかく、DBクエリが高すぎる場合は、一時停止せずにテーブルをスクロールすることはできません、いくつかのローディングインジケータを追加する必要があります。私たちはプロジェクトでこれを正確に実行しています。最後のセルには進捗インジケータのみがあり、新しいデータがサーバからロードされると、セルが削除され、新しいデータでセルが追加されます。しかし、これは、ロードセルが一番下にあるときにのみうまくいきます。 – Sulthan

関連する問題