0

我正在努力制作这个我必须在我正在构建的 iPhone 应用程序上显示的 GIF。我现在正在分析应用程序,我意识到我一直被分配到 aUIColor并且它几乎使用了手机的所有 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:]: index 1 beyond bounds for empty array

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 回答