2013-07-13 7 views
9

挿入/削除アニメーションコールの実行後にUITableViewのコンテンツサイズが更新されると、気になります。アニメーションが完了していなくても、フレームサイズ/コンテンツサイズが直ちに更新されるという点で、ほとんどの[UIView animation ...]ブロックと思っていましたが、そのようには見えません。何か案は?いつ行挿入/削除アニメーションでUITableViewコンテンツサイズが更新されるのですか?

+1

これを解決しましたか?私は同じ問題にぶつかっています。行を挿入/削除すると、tableView.contentSizeが更新されると予想されますが、それは非同期であるようです。 – VaporwareWolf

答えて

0

コンテンツのサイズは高さについてのデリゲートを呼び出した後に変更されます:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; 
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section; 
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section; 
+2

お返事ありがとうございます。とにかく私に通知することができますか、またはコンテンツのサイズが変更されたことを教えてくれるデリゲートメソッドの任意のタイプですか?アニメーションが完了した後に起こるようですが、前もってテーブルの周りにアニメーションを作成できるように、新しいコンテンツサイズを取得したいと考えています。 – SLEW

+0

tableview:heightForRowAtIndexPath:メソッドとコンテンツサイズが更新されるのを見ていませんでした。しかし、これはコンテンツのサイズを計算するためのソリューションにつながりました。ソリューションを別の回答として投稿します。 – Daren

2

残念ながら、私はどちらかのUITableViewから行を削除/追加するときcontentSizeを更新するための良い方法を見つけることができませんでしたが、あなたが追加/削除しているセルのインデックスパスを知っているなら、それが何であるかを計算する方法を見つけました。

変更された行のインデックスパスを使用すると、tableView:heightForRowAtIndexPath:メソッドを使用してそれぞれのセルの高さを計算し、それをテーブルビューの現在のコンテンツサイズの高さに追加できます。あなただけの1行を追加している場合はここでの例です:それは、sizeThatFits()のように見える

[self.tableView insertRowsAtIndexPaths:@[indexPathOfNewRow] withRowAnimation:UITableViewRowAnimationAutomatic]; 
CGFloat newCellHeight = [self tableView:self.tableView heightForRowAtIndexPath:indexPathOfNewRow]; 
CGFloat newContentSizeHeight = self.tableView.contentSize.height + newCellHeight 
1

保留中の新しいcontentSizeの高さを公開することができます。その保留中のサイズを割り当てることで、スクロールアニメーションの早期解決を図ることができます。新しいを使用して(

tableView.insertRows(at: [newIndexPath], with: .none) 
tableView.scrollToBottom(animated: true) 

とすべての方法下にテーブルのスクロールを持っています。このようなもので

extension UIScrollView { 

    var pendingContentSize: CGSize { 
     var tallSize = contentSize 
     tallSize.height = .greatestFiniteMagnitude 
     return sizeThatFits(tallSize) 
    } 

    func scrollToBottom(animated: Bool) { 
     contentSize = pendingContentSize 
     let contentRect = CGRect(origin: .zero, size: contentSize) 
     let (bottomSlice, _) = contentRect.divided(atDistance: 1, from: .maxYEdge) 
     guard !bottomSlice.isEmpty else { return } 
     scrollRectToVisible(bottomSlice, animated: animated) 
    } 

} 

私はこのようなビューコントローラコードを記述することができますよコンテンツサイズ)を2行目から最後の行までスクロールする代わりに(古いコンテンツサイズを使用して)

関連する問題