2016-10-30 1 views
0

行、セクション、行の高さが大幅に変化するため、UITableviewのデータをリロードしています。トランジションを柔らかくするため、私はボタンをタップするときにトランジションを選択しました。 reloadDataやコンテンツオフセットコードをアニメーションブロック内に配置すると、結果は「ハッピー」/「吃音」になります。アニメーションの前にビューの変更を配置すると、それは夢のように機能します。 これはなぜ機能しますか?私は、transitionWithView(iOS 10.1)のバグのある動作を使用していますか?これはどのように正しく行われるべきですか?アニメーションブロック外の変更を使用すると、UIView transitionWithViewがスムーズです

[self.tableView reloadData]; 
CGPoint bottomOffset = CGPointMake(0, [self.tableView contentSize].height + [self.tableView contentInset].bottom - self.tableView.frame.size.height); 
[self.tableView setContentOffset:bottomOffset animated:NO]; 

[UIView transitionWithView: self.tableView 
          duration: 0.35f 
          options: UIViewAnimationOptionTransitionCrossDissolve 
         animations: ^(void) 
         { 
         } 
         completion: nil]; 

答えて

0

transitionWithViewは、画面全体の表示を変更するためによく使用され、一部の変更は表示されません。 Appleさんのように:

トランジションアニメーションは、別のビューコントローラの内容を別のビューコントローラの内容と入れ替えます。

ほとんどの場合そう

、簡単なアニメーションで動作するようにそれが

[UIView animateWithDuration:(NSTimeInterval) animations:^(void)animations completion:^(BOOL finished)completion] 

を使用することを推奨したりも

[UIView beginAnimations:(nullable NSString *) context:(nullable void *)] 
//place your view changes here to animate it 
//...... 
[UIView commitAnimations] 

ご意見をアニメーション化する別の方法がありますされても方法がありますそのテーブルビューは

[tableView insertRowsAtIndexPaths:(nonnull NSArray<NSIndexPath *> *) withRowAnimation:(UITableViewRowAnimation)] 

オプションを使用すると、テーブルビューに新しいデータを追加してアニメートすることができます。基本的には、テーブルビューに表示するオブジェクトの配列に新しいデータを追加し、このメソッドを呼び出して変更を表示します。彼らはすべて自分で働いていますので、その一方で、あなたは上記のものを2例では、別の方法

[tableView beginUpdates]; 
//make some changes 
[tableView endUpdates]; 

を試すことができます は、[のtableView reloadData]呼び出す必要はありません。

+0

答えをありがとう。しかし、問題はanimateWithDurationがスムーズに動かないということです(クロスディゾルブのように、フェードインとフェードアウトするのではなく、コンテンツのオフセットによってジャンプしている可能性があります)。コントローラーは、アニメーションブロックの変更を除外するとうまく動作します。 – damcify

+0

@damcifyはいくつかの新しいアプローチで編集されました。 – valivaxa

関連する問題