3

このトピックについてここで見つけることができるすべてを読んでいますが、続行する最善の方法はまだわかりません. アニメーション ループとして機能するUIImageView脂肪の配列を使用するヘビーがあります。UIImagesこれUIImageViewは、アプリ内のすべての画面の背景として機能しています。(私の要求ではなく、クライアントの要求です。嫌いではありません。) png ファイルをできる限り小さく最適化しましたが、それでもかなりの負荷がかかります。

UIImageその名前の既存の画像をキャッシュで検索する方法に関するいくつかの投稿を読みました (例:アプリ全体の背景画像の Shared UIImageView - Singleton Property )が、これは起こっていないようです。また、ここでシングルトンと appdelegate でのインスタンス化について読んでいますが、これらのいずれかが正しい方法であるかどうかはわかりません。

UIImageViewアプリの寿命に一度ロードして、すべてのビューコントローラーのバックグラウンドで使用する最良の方法は何ですか? ところで、読み込みには数秒かかるため、アプリの開始時に、単一の静止画像とアクティビティ インジケーターを使用する「読み込み中」ページを追加します。

また、私はテスト ツールやパフォーマンス ツールにも詳しくありません。パフォーマンスをテストし、これがアプリ全体でためらいの原因であることを確認するには、どれを使用すればよいですか?

初心者の質問については事前にお詫びします - 私は通常、質問をすることをまったく避けますが、この場合のように、調査をどこから始めればよいかさえわからないことがあります。

4

1 に答える 1

2

私自身はむしろ満足しています。私は AppDelegate テクニックを使用しましたが、うまく機能しています。AppDelegate で UIImageView プロパティを宣言し、そのゲッターにイメージ コードを追加します。

- (UIImageView *)backgroundImageView {
    if (!_backgroundImageView) {
        NSMutableArray *tempArray = [NSMutableArray arrayWithCapacity:150];
        for (int imageNum = 0; imageNum < 150; imageNum++) {
            [tempArray addObject:[UIImage imageNamed:[NSString stringWithFormat:@"image_00%03i.png",imageNum]]];
        }
        _backgroundImageView = [[UIImageView alloc] initWithImage:[UIImage animatedImageWithImages:tempArray duration:4.0]];
    }
    return _backgroundImageView;
}

これにより、applicationDidReceiveMemoryWarning でオブジェクトを強制終了することもできました。

次に、すべての UIViewController クラスにポップできるヘルパー クラスを作成しました。

+ (void)placeBackgroundImageUnderView:(UIView *)masterView {
    myAppDelegate *appDelegate = (myAppDelegate *)[[UIApplication sharedApplication] delegate];
    //Correct for shrinkage
    appDelegate.backgroundImageView.frame = masterView.frame;
    [masterView addSubview:appDelegate.backgroundImageView];
    [masterView sendSubviewToBack:appDelegate.backgroundImageView];
}

これにより、各 viewDidLoad メソッドに 1 行追加することができました。

[HelperClass placeBackgroundImageUnderView:self.view];

問題は、UIImage を単独で使用するだけで、全体がキャッシュされ、読み込み時間が短縮されるということです。しかし、時々画像をリロードする必要があるようです - メモリの問題ですか? したがって、これにより、オブジェクトを一度インスタンス化して同じオブジェクトを使用することで、より詳細に制御できるようになります。また、必要に応じてそのオブジェクトを nil に設定してメモリを解放することもできます。

追加してから、アプリ全体の読み込みが大幅に高速化されました。その初期ロード用のアクティビティ インジケータを備えた追加のロード画面を追加し (これも美しく機能します)、その後はすべてすぐに満足します。

于 2013-01-04T14:27:50.163 に答える