2016-02-21 12 views
5

私は時間のために、この問題に頭を叩いて、私はこのような何かをしようとするたびにされてきた:なぜinsertRowsAtIndexPathsは常にTableViewを上にスクロールさせますか?

self.dataArray.append(newCellObj) 

、その後、私はこれを実行します。

self.tableView.beginUpdates() 
    self.tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Top) 
    self.tableView.endUpdates() 

をのUITableViewは自動的にスクロールしますページの上部。

は私がしようとした場合でも:

self.tableView.scrollEnabled = false 
    self.tableView.beginUpdates() 
    self.tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Top) 
    self.tableView.endUpdates() 

のUITableViewはまださえ完全に無効にスクロールして一番上にスクロールします。 insertRowsAtIndexPathsの後にScrollViewが上にスクロールするのはどうしてですか?代わりに

self.tableView.reloadData() 

:この問題のために私が持っている

唯一の解決策は、これを使用することです。代わりにreloadDataを使用すると、大丈夫ですが、本当に素晴らしいアニメーションが失われてしまいます。

私もself.tableView.scrollsToTop = falseを持っていると私はinsertRowsAtIndexPaths

+3

estimatedRowHeightより正確に設定

  • 無効に自動レイアウト私はあなたがここでうまく反応しない他のコードを持っているかもしれないと思います。あなたは一番上にスクロールするべきではないということは間違いありません。あなたはbegin/endの更新の間にいなくてもやってみましたか?関連性のある他のコードはありますか? –

  • +1

    @RyanPoolosありがとうございます、それは私のための開始/終了の更新なしでうまく動作します。 :D –

    答えて

    12

    後、私はOPと同じ問題に遭遇して、これを上書きします何かがあります、何とかスクロールを無効にすることができ、そのような多くの他の構成を試してみましたが、きました。さらに、私のテーブルビューのセルの一部が「空白」になり、完全に消えて、this related questionにつながってしまうことがありました。

    私にとって

    、解決策は、次のいずれかを実行することでした。

    • が実装func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
    • UITableView
    +3

    ありがとうございます! 'estimatedHeightForRowAtIndexPath'は完全に問題を解決したようです!この値を私のtableViewの平均セルよりもはるかに高い値に設定すると、「インデックスの行の行の最大高さ」のほうが大きくなるようですが、これはそのトリックを行ったようです。そして私は '自動レイアウト 'をオンにしておくこともできました! :D私はプロジェクトの全部でこれらの "update table view"関数をいくつか持っており、それぞれが全く異なるクラスのセルを扱い、estimatedHeightのトリックはそれらのどれか一つに固定されています。これに代わる方法は、手動のheightForRowAtIndexPathです。 – Mateusz266

    +2

    あなたは伝説です!どうもありがとうございます!!! – Gix

    +0

    私は同じ問題がありますが、 'estimatedHeightForRowAtIndexPath'と' estimatedRowHeight'は動作しませんでした。 – lee

    0
    - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
        return UITableViewAutomaticDimension; 
    } 
    
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
        return UITableViewAutomaticDimension; 
    } 
    
    // I'm use auto layout and this variant without animation works 
    // ...insert object to datasource 
    NSUInteger idx = [datasource indexOfObject:myNewObject]; 
    if (NSNotFound != idx) 
    { 
        NSIndexPath *path = [NSIndexPath indexPathForRow:idx inSection:0]; 
        [self.table beginUpdates]; 
        [self.table insertRowsAtIndexPaths:@[path] 
             withRowAnimation:UITableViewRowAnimationNone]; 
        [self.table endUpdates]; 
        [self.table scrollToRowAtIndexPath:path 
             atScrollPosition:UITableViewScrollPositionBottom 
               animated:NO]; 
    } 
    
    関連する問題