1

画像の配列を .animationImages プロパティにロードし、その配列をその場で変更できるようにするための最も効果的/効率的なソリューションを取得しようと、数日間戦ってきました。シナリオは次のとおりです。 - UIImageView が 1 つあります。 - ユーザー入力 (電話の動き、ジャイロ) に応じて、特定の画像配列を読み込んでアニメーション化します。- ユーザー入力 (タッチ) で、読み込まれたアニメーションを再生します。

これで、initWithData を使用して gyroHandler で実行されたブロックから呼び出された「NSThread detachNewThreadSelector」を使用して、画像の配列が別のスレッドにロードされます (特定の場合のみ)。他の開始方法は完全に失敗しました。

ここでの問題は、(現在のアニメーションが読み込まれてから) 初めてタッチしてアニメーションをトリガーすると、全体が約フリーズすることです。1 秒後にアニメーションを再生します。もう一度タッチすると、遅延やフリーズなしでアニメーションが正常に再生されます。

今、私はバックグラウンドでアニメーション化するためにどこかを読んでいます...私は使用してみました:

[imgAnimationKey performSelectorInBackground:@selector(startAnimating) withObject:nil];

しかし、結果は同じでした。

私の配列には 19 個の画像があり、常に同じ画像を持つ可能性が最も高いです。問題は、再生できるアニメーションが 5 つ以上ある可能性があるため、複数の UIImageView がないことです。

画像をプリロードして、最初の再生の遅延を回避する方法を知っている人はいますか? または、アニメーションを別のスレッドで実行して、この影響を回避できますか (間違っている可能性があります)。

ありがとう!

4

1 に答える 1

0

UIImageView のイメージ プロパティに提供する前に、バックグラウンド スレッドでイメージをプリロードするための UIImage クラスのカテゴリを作成できます。

時間:

#import <Foundation/Foundation.h>

@interface UIImage (preloadedImage)

- (UIImage *) preloadedImage;

@end

母:

#import "UIImage+preloadedImage.h"

@implementation UIImage (preloadedImage)

- (UIImage *) preloadedImage {
    CGImageRef image = self.CGImage;

    // make a bitmap context of a suitable size to draw to, forcing decode
    size_t width = CGImageGetWidth(image);
    size_t height = CGImageGetHeight(image);

    CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef imageContext =  CGBitmapContextCreate(NULL, width, height, 8, width * 4, colourSpace,
                                                       kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little);
    CGColorSpaceRelease(colourSpace);

    // draw the image to the context, release it
    CGContextDrawImage(imageContext, CGRectMake(0, 0, width, height), image);

    // now get an image ref from the context
    CGImageRef outputImage = CGBitmapContextCreateImage(imageContext);

    UIImage *cachedImage = [UIImage imageWithCGImage:outputImage];

    // clean up
    CGImageRelease(outputImage);
    CGContextRelease(imageContext);

    return cachedImage;
}

@end

次に、バックグラウンド スレッドで preloadedImage を呼び出し、メイン スレッドで結果を設定します。

于 2012-07-25T07:46:13.817 に答える