2016-06-27 1 views
6

動的セルの高さを使用すると、テーブルビューを下にスクロールするにはどうすればよいですか?このコードは、このシナリオでは動作しません何らかの理由で動的セルの高さを使用しているときにテーブルのビューを下にスクロール

[self.tableView scrollRectToVisible:CGRectMake(0, self.tableView.contentSize.height - self.tableView.bounds.size.height, self.tableView.bounds.size.width, self.tableView.bounds.size.height) animated:YES]; 

ありがとう!

EDIT:@ Hasiyaさんのコードを使用して下にスクロールすると、あなただけでそのトリックを行うことができます。

+0

'[self.tableView setContentOffset:...]'は機能しますか? –

+0

残念ながら... –

+1

、tableView.scrollToRowAtIndexPath(NSIndexPath(forRow:arrayData.count、inSection:0)、atScrollPosition:UITableViewScrollPosition.Bottom、animated:true)を試してください –

答えて

2

を試してみてください。下にスクロールしてもうまくいかない理由は、セルの高さがnot properly estimatedなので、後で分かるように、行の挿入/削除もバグです。この問題を回避するには、近い見積もりをestimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPathに戻してください。しかし、あなたがそれを行うことができない場合(そしてほとんどの場合、あなたはできないでしょう)、まだ素晴らしい解決策があります:辞書のセルの高さを格納し、セルが再利用されるときにestimatedHeightのものを返しますたとえば、テーブルビューがスクロールされます)。私は別の質問でこの解決策を見つけましたので、あなたがこれを実行する方法について実際のコードについて調べてください。 EDIT

Original solution by @dosdos

(おそらく、あなたの多くは、自分自身のためにこれを書くことができます):たぶんただ、これは不要である下部までスクロールし修正するための、しかし非常に私の意見では推奨。行の高さを見積もるためにこれを使用しないと、多数のセルでバギースクロールやパフォーマンスの低下などのその他の問題が発生します。

はまた、あなたは以下のコードで述べたように、scrollToRowAtIndexPathで試してみてくださいviewDidAppear

let lastItem = IndexPath(item: dataSource.count - 1, section: 0) 
tableView.scrollToRow(at: lastItem, at: .bottom, animated: true) 
+0

あなたの答えは受け入れられた回答としてマークする必要があります – mrvincenzo

+0

感謝を知っていますが、私は別の15時間まで受け入れることができません –

1

これがうまくいくと思います。私は答えを発見した、結局この

[self.tableview setContentOffset:CGPointMake(0, CGFLOAT_MAX)] 

それとも

if (self.tableview.contentSize.height > self.tableview.frame.size.height) 
    { 
     CGPoint offset = CGPointMake(0, self.tableview.contentSize.height -  self.tableview.frame.size.height); 
     [self.tableview setContentOffset:offset animated:YES]; 
    } 
+1

他の解決策がありましたが、CGFloat.greatestFiniteMagnitude(CGFLOAT_MAXのスピーディーバージョン)を使用すると、実際にはテーブルビューでcellForRow(at:IndexPath、...)を呼び出すだけなので、最も効率的でした。ありがとう! –

0

にこれを追加する必要があります。

- (void)viewWillAppear:(BOOL)animated 
{ 

    [super viewWillAppear:animated]; 

    NSInteger no = array.count-1; 

    NSIndexPath *lastIndex = [NSIndexPath indexPathForRow:no inSection:0]; 

    [self.tableView scrollToRowAtIndexPath:lastIndex atScrollPosition:UITableViewScrollPositionBottom animated:YES]; 

} 
+0

私はこれを反映するために私の質問を編集しました!ありがとう! –

+0

ようこそ、幸せなコーディングがあります。 – Hasya

7

だけiPhone用iOSの10.1をターゲットにXcodeの8.3.2を使用して、私のスウィフト3.1のコードのために働い以下。

私はOPと同じ問題がありました。私のアプリにはメッセージング機能が含まれていました。私はメッセージビューがスタックにプッシュされたときに最後の投稿が見えるようにしたかった。私のテーブルビューのセルの高さは、メッセージの内容によって可変です。解決策のどれも私の満足のために働かなかった(最後のテーブルビュー行は見えないか、部分的にしか見えなかった)。しかし、ここで私の仕事です:

Interface Builderの(IB)で
  • は、私は私の平均の行の高さは、私の場合50であることが予想よりも大きい値にセルの行の高さを設定(確認してください'Custom'チェックボックス)。次のように「のviewDidLoad」関数はテーブルビューの「rowHeightの」プロパティを設定内部テーブルビューが実装されているのViewControllerで
  • myTableView.rowHeight = UITableViewAutomaticDimension 
    
  • また「のviewDidLoad」機能には、にテーブルビューの「estimatedRowHeight」を設定しましたあなたの平均行の高さを期待するよりも高い値。私の場合は最終的に140

で、最も重要なのは、私はこのコードのビットを書いた:

extension UITableView { 

    func scrollToBottom() { 
     let rows = self.numberOfRows(inSection: 0) 

     let indexPath = IndexPath(row: rows - 1, section: 0) 
     self.scrollToRow(at: indexPath, at: .top, animated: true) 
    } 
} 

お知らせat: .top —これは私の問題を解決するものです。 UITableViewScrollPositionパラメータの.bottomの値を渡すだけで機能しませんでした。 .middleを渡しても—を処理しましたが、.bottomを処理しませんでした。

だから、いつでも私のデータセットを更新する必要があるか、または新しいメッセージは私が単にat: .topat: .bottomパラメータを変更することにより、この「方法」の結果をテストした

func getTableViewData(){ 
    // Get your data here any way you usually do.. 

    // call to reload 
    myTableView.reloadData() 
    // call the scroll function 
    myTableView.scrollToBottom() 
} 

を呼び出して到着。私がat: .topに変更するたびに、最後のテーブル行が完全に表示され、テーブルが一番下までスクロールされました。

+0

実際、 '.top'は' .bottom'よりもはるかに優れています。素晴らしい発見! – villapossu

+0

素晴らしい発見!私はこの問題の解決策を数週間探しており、 '.top'は完璧に動作します! –

+0

「bottom」を「top」に変更すると私のために動作します!ありがとう! – Elvin

関連する問題