iPhoneアニメーションの高速化
-
05-07-2019 - |
質問
Navigation Controllerの異なるビューで約6個の情報をすべてユーザーに入力させるデータ入力アプリケーションがあります。これは正常に機能しますが、ユーザーがアプリケーションに慣れると、次の画面が表示されるまでにかかる時間が遅くなります。
アニメーションを使用せずにアプリケーションを試しましたが、完全に正しく感じられません。アニメーションをより速く発生させる方法はありますか?主にNavigation Controller、Table View、Picker Viewを使用しています。
解決
新しいビューを読み込むたびにペナルティが発生します。スクロールビューまたは異なるレイアウトを使用して画面を統合しようとする可能性があります。 また、不要なグラフィックを読み込んでいる場合は、削除することもできます。
また、各ビューをサブビューとして自分で追加することもできます。この場合、とりわけアニメーションの継続時間を制御できます。このコードはあなたのためにそれを行いますが、私が書いたばかりでテストしなかったので注意してください(トランジションスタイルとブールパラメータは、今は何もしないので削除できます)。
UIViewControllerExtendedPresentModalViewController.h
#import <Foundation/Foundation.h>
typedef enum _ExtendedModalTransitionStyle
{
ExtendedModalTransitionStyleTopDown
} ExtendedModalTransitionStyle;
@interface UIViewController ( ExtendedPresentModalViewController )
- (void)presentModalViewController: (UIViewController*)modalViewController
withTransitionStyle: (ExtendedModalTransitionStyle)style
animated: (BOOL)animated;
- (void)dismissModalViewController: (UIViewController*)modalViewController
withTransitionStyle: (ExtendedModalTransitionStyle)style
animated: (BOOL)animated;
@end
UIViewControllerExtendedPresentModalViewController.m
#import "UIViewControllerExtendedPresentModalViewController.h"
#import <QuartzCore/QuartzCore.h>
@implementation UIViewController ( ExtendedPresentModalViewController )
- (void)presentModalViewController: (UIViewController*)modalViewController
withTransitionStyle: (ExtendedModalTransitionStyle)style
animated: (BOOL)animated
{
[modalViewController retain]; // we'll need this for a little while, hang on to it.
CATransition* transition = [CATransition animation];
[transition setDuration: 0.4];
[transition setTimingFunction:
[CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionLinear]];
[transition setType: kCATransitionMoveIn];
[transition setSubtype: kCATransitionFromBottom];
[[[self view] layer] addAnimation: transition
forKey: nil];
[[self view] addSubview: [modalViewController view]];
}
- (void)dismissModalViewController: (UIViewController*)modalViewController
withTransitionStyle: (ExtendedModalTransitionStyle)style
animated: (BOOL)animated
{
CATransition* transition = [CATransition animation];
[transition setDuration: 0.4];
[transition setTimingFunction:
[CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionLinear]];//kCAMediaTimingFunctionEaseInEaseOut]];
[transition setType: kCATransitionReveal];
[transition setSubtype: kCATransitionFromTop];
[[[[modalViewController view] superview] layer] addAnimation: transition
forKey: nil];
[[modalViewController view] removeFromSuperview];
[modalViewController release]; // all done, we can let this go.
}
@end
他のヒント
テーブルビューでセルを再利用していますか?それらを本当に再利用するようにしてください。つまり、if(cell == nil)ケース内のセルのすべてのセットアップを行い、一般的なケースのデータのみを適用します(再利用と新規作成の両方に適用)。
透明度がセル内で持つ可能性があるパフォーマンスヒットに注意してください。多くの場合、物事を透明にする必要があるように見えますが、UITableViewCellが問題を認識しているので、そうしないかもしれません。一部のオブジェクトで透明度をオフにするのは間違っているように思えるかもしれませんが、実際に機能するかどうかを確認する価値があります。セルをスクロールするコストの大部分は、最初にセルを作成するのではなく、セルが移動するときの合成です。
もう1つ役立つのは、セルにすべてのビューを追加するのではなく、セルに適用するビューを事前に合成してから、事前に作成したビューを1つだけセルに適用することです。
スクロールセルのビューを実際にアニメーション化する場合は、それを再考するか、少なくともある程度の簡略化を使用して、デバイスへの負担を少し軽減する必要があります。
Matt Gallagherのセル処理戦略の採用を検討することもできます-cellForRowAtIndexPathが停止し、1つの長い厄介なifのセットになります。