2017-04-18 3 views
2

tableviewを下に読み込んでいます。つまり、tableViewが下から読み込まれ、スクロールしてより多くのコンテンツが表示されます。下からスクロールアップ(逆テーブルビュー)(iOS)

まず、dataSource配列を逆にしてみました。内容は逆ですが、それでも上からロードされ、ユーザーは下にスクロールしてより多くのコンテンツを表示する必要があります。

私はその後、viewWillAppearで下からのtableViewをロードしようとした:(私は、各セル内の私UITextViewを埋めるNSTextAttachmentを、使用している私は非同期的に画像をダウンロードしていますので、しかし、動作しません、この試み

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    if (self.conversationTableView.contentSize.height > self.conversationTableView.frame.size.height) { 
     let offset = CGPoint(x: CGFloat(0), y: CGFloat(self.conversationTableView.contentSize.height - self.conversationTableView.frame.size.height)) 
     self.conversationTableView.setContentOffset(offset, animated: true) 
    } 
} 

)。プレースホルダが実際にダウンロードされたイメージに置き換えられるたびに、tableViewコンテンツのオフセットがシフトします(プレースホルダのイメージの高さは、ほとんど常にダウンロードされたイメージの高さよりも小さくなります)。 contentOffsetをこのように設定しても機能しません。

テーブルビューを一番下から読み込み、スクロールしてコンテンツを表示するにはどうすればよいですか?あなたのviewWillAppear方法で

+0

をあなたは「下からの負荷」とはどういう意味ですか?一番下のテーブルのアニメーションを作りたいですか? –

+0

いいえ。テーブルが読み込まれるとき、私はYオフセットが既に底部にあることを望みます。その後、ユーザーはさらに多くのコンテンツを見るためにスクロールします –

+0

逆テーブルビューのようなものが欲しいですか?この[拡張機能](https://github.com/marty-suzuki/ReverseExtension)を確認することができます。 – ridvankucuk

答えて

10

最も良い方法は、tableViewとそのセルを反転することでした。この方法では、セルがサイズを変更する場合(非同期ダウンロードなどのため)、オフセットよりもテーブルビューの下部から読み込みます。また

//In ViewDidLoad 
conversationTableView.transform = CGAffineTransform(rotationAngle: -(CGFloat)(M_PI)); 

//In cellForRowAtIndexPath 
cell.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI)); 

var tableHeaderView = UIView(frame: headerFrame) 
tableHeaderView.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI)); 
conversationTableView.tableFooterView = tableHeaderView 

そして、あなたはfooterViewとheaderViewを持っている場合は、単にフッターにヘッダーを設定し、フッタ:あなたはheaderViewを持っている場合は、単にtableView.tableFooterViewに設定ヘッダー

編集: あなたは、スクロールインジケータ反転する場合:

conversationTableView.scrollIndicatorInsets = UIEdgeInsetsMake(0.0, 0.0, 0.0, conversationTableView.bounds.size.width - 8.0) 
+0

スマートで創造的なソリューション!本当にうまく動作します。私が気づいたことの一つは、スクロールバーが右ではなく画面の左側に現れることでした。これを解決するためにconversationTableView.scrollIndicatorInsetsを調整しました。たぶん、これを答えに加える価値がありますか?すなわちconversationTableView.scrollIndicatorInsets = UIEdgeInsetsMake(0.0、0.0、0.0、conversationTableView.bounds.size.width - 8.0) – Bocaxica

+1

私の答えを更新しました、ありがとうございます:) –

1

は、次の手順を実行します。bottomIndexPathは、あなたのテーブルビューの最後の行のためのindexPathある

tableView.scrollToRowAtIndexPath(bottomIndexPath, atScrollPosition: .Bottom, 
     animated: true) 

。長さがnで、テーブルにセクションが1つしかない場合は、通常IndexPath(item: n-1, section: 0)になりますが、具体的にはUITableViewを確認してください。

これにより、tableViewの一番下から確実に始めることができます。これを済ませたら、あなたのcellForRowAtIndexPathメソッドがあなたのUITableViewDataSourceのデータを逆に返してくれることを保証するだけです。あなたが望む効果が得られます。

+0

これは、イメージを非同期にダウンロードしてテキストビュー(セルを含む)に配置しない場合に機能します。しかし、イメージをダウンロードしているので、scrollToRowメソッドが呼び出された後にセルの高さが変更されます。 –

+0

イメージのダウンロードが完了したら、何らかのコールバックがありますか?現行の行のテーブル/ボトムの下にスクロールするだけで、アニメーションは発生しません。 –

+1

はい、私はそうですが、イメージがダウンロードされるたびにオフセットを変更することは、この問題を解決する最も効率的な方法ではありません。好奇心があったら私のソリューションを投稿したばかりです。あなたの助けをありがとう –