0

作成中の iPhone アプリで表示する必要があるこの GIF を作成するために、私は地獄のように努力しています。アプリのプロファイルを作成している時点で、継続的に割り当てられていてUIColor、事実上すべての電話の CPU を使用していることに気付きました。

私は、アニメーションの作成と実行に使用するこの関数を最適化するために、午前中ずっと必死に努力してきました。誰かが洞察を持っているなら、私はそれを大いに感謝します。

私はその UIColor を for ステートメントから引き出そうとしているだけですが、おそらく誰かが私がこれをより良い方法で行うことができることに気付くでしょう。

- (void)doBackgroundColorAnimation
{
     static NSInteger i = 0;
     int count = 34;
     NSMutableArray *colors = [[NSMutableArray alloc] initWithCapacity:count];
     for (int i=1; i<=34; i++) {
     NSString *strImgName = [NSString stringWithFormat: @"layer%d.png", i];
     UIColor *image = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:strImgName]];
     if (image) {
     [colors addObject:image];
     }
     }

     if (i >= [colors count]) {
     i = 1;
     }
     [UIView animateWithDuration:0.05f
     animations:^{
     self.animationView.backgroundColor = [colors objectAtIndex:i];
     } completion:^(BOOL finished) {
     ++i;
     [self doBackgroundColorAnimation];
     }];
}

編集:コードを投稿するリクエスト

NSMutableArray *colors = [[NSMutableArray alloc] initWithCapacity:count];
static NSString *strImgName;
UIColor *image = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:strImgName]];
for (int i=1; i<=34; i++) {
strImgName = [NSString stringWithFormat: @"layer%d.png", i];
if (image) {
[colors addObject:image];
}
}

-[__NSArrayM objectAtIndex:]: 空の配列の範囲を超えたインデックス 1 を返します

4

1 に答える 1

0

これは、H2CO3 のコメントのより明確な説明です。

いくつかのクラス プロパティを定義します。

@property (nonatomic, retain) NSMutableArray* colors;
@property (nonatomic, assign) currentColorIndex;

次に、単一の色の初期化ルーチンを用意します。

- (void)calledDuringInit
{
    self.colors = [NSMutableArray array];

    for (int i=1; i<=34; i++) 
    {
        NSString *strImgName = [NSString stringWithFormat: @"layer%d.png", i];
        UIColor *image = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:strImgName]];
        if (image)
        {
             [self.colors addObject:image];
        }
    }
}

この時点で、doBackgroundColorAnimation はカラー配列を作成し続ける必要はありません。

- (void)doBackgroundColorAnimation
{
     if (self.currentColorCount >= [self.colors count]) 
     {
         self.currentColorCount = 1;
     }

     [UIView animateWithDuration:0.05f
     animations:^{
         self.animationView.backgroundColor = [self.colors objectAtIndex:self.currentColorCount];
     } completion:^(BOOL finished) {
         ++self.currentColorCount;
         [self doBackgroundColorAnimation];
     }];
}
于 2012-12-14T20:31:44.107 に答える