UIImageView задержка анимации при выполнении startAnimating - PullRequest
1 голос
/ 23 октября 2011

У меня есть анимация фона меню, которая составляет 21 кадр. Я загружаю их в память, используя приведенный ниже код в методе viewDidLoad представления.

NSMutableArray *menuanimationImages = [[NSMutableArray alloc] init];

for( int aniCount = 0; aniCount < 21; aniCount++ )
{

    NSString *fileLocation = [[NSBundle mainBundle] pathForResource: [NSString stringWithFormat: @"bg%i", aniCount + 1] ofType: @"png"];
    NSData *imageData = [NSData dataWithContentsOfFile: fileLocation];

    [menuanimationImages addObject: [UIImage imageWithData:imageData]];

}

settingsBackground.animationImages = menuanimationImages;

К сожалению, делаем [settingsBackground startAnimating]; не работает в методе viewDidLoad. Есть ли способ предварительно загрузить анимацию, чтобы при первом запуске не было задержки 1-3 секунды?

Ответы [ 4 ]

9 голосов
/ 13 апреля 2012

Я бы не рекомендовал использовать imageNamed и полагаться на встроенные механизмы кэширования.Вы найдете много дискуссий по этому вопросу, если будете искать, но в любом случае это не обязательно будет предварительно отображать ваши изображения.

Я использую следующий код для предварительной загрузки и предварительной визуализации изображений, поэтомунет задержки при анимации в первый раз.

NSMutableArray *menuanimationImages = [[NSMutableArray alloc] init];

for (int aniCount = 1; aniCount < 21; aniCount++) {
    NSString *fileLocation = [[NSBundle mainBundle] pathForResource: [NSString stringWithFormat: @"bg%i", aniCount + 1] ofType: @"png"];
    // here is the code to pre-render the image
    UIImage *frameImage = [UIImage imageWithContentsOfFile: fileLocation];
    UIGraphicsBeginImageContext(frameImage.size);
    CGRect rect = CGRectMake(0, 0, frameImage.size.width, frameImage.size.height);
    [frameImage drawInRect:rect];
    UIImage *renderedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    [menuanimationImages addObject:renderedImage];
}

settingsBackground.animationImages = menuanimationImages;
2 голосов
/ 01 июля 2013

Проблема с каждым из этих ответов заключается в том, что предлагаемое «исправление» заключается в предварительной загрузке всех данных изображения в память.Это может и приведет к сбоям, если ваши изображения слишком велики или их слишком много. Для получения более подробной информации см. Мой ответ для uiimage-animation-причиной-app-to-crash-memory-leaks .Реальное исправление заключается в том, что вам нужно распаковать изображения, но не хранить их все в памяти.Или вы можете использовать формат фильма, который уже выполняет распаковку для всех кадров за один шаг, так что переход от кадра к кадру не является дорогостоящей операцией.

0 голосов
/ 13 ноября 2011

Попробуйте следующий код, обычно у вас не должно быть задержек. Также этот код проще:

 NSMutableArray *menuanimationImages = [[NSMutableArray alloc] initWithCapacity:21];
 NSString *imageName;

 for( int aniCount = 1; aniCount < 21; aniCount++ )
 {
     imageName = [NSString stringWithFormat:@"bg%d.png", aniCount];
     [menuanimationImages addObject:[UIImage imageNamed:imageName]];
 }

 settingsBackground.animationImages = menuanimationImages;
 // all frames will execute in 2 seconds
 settingsBackground.animationDuration = 2.0;
 // repeat the annimation forever
 settingsBackground.animationRepeatCount = 0;
 // start animating
 [settingsBackground startAnimating];
0 голосов
/ 23 октября 2011

Для свойства animationImages UIImageView требуется массив UIImage объектов, а не массив объектов NSData.

Вы также можете установить длительность и repeatCount, даже если они имеют значения по умолчанию.

Пример:

if (!self.idleView.animationImages) {
    self.idleView.animationImages = [NSArray arrayWithObjects:[UIImage imageNamed:@"idle1.png"],
                      [UIImage imageNamed:@"idle2.png"],
                      [UIImage imageNamed:@"idle3.png"],
                      [UIImage imageNamed:@"idle4.png"],
                      [UIImage imageNamed:@"idle5.png"],
                      [UIImage imageNamed:@"idle6.png"],
                      [UIImage imageNamed:@"idle7.png"],
                      [UIImage imageNamed:@"idle8.png"],
                      [UIImage imageNamed:@"idle9.png"],
                      [UIImage imageNamed:@"idle10.png"],
                      [UIImage imageNamed:@"idle11.png"],
                      [UIImage imageNamed:@"idle12.png"],
                      [UIImage imageNamed:@"idle13.png"],
                      [UIImage imageNamed:@"idle14.png"],
                      [UIImage imageNamed:@"idle15.png"],
                      [UIImage imageNamed:@"idle16.png"],
                      [UIImage imageNamed:@"idle17.png"],
                      [UIImage imageNamed:@"idle18.png"],
                      [UIImage imageNamed:@"idle19.png"],
                      [UIImage imageNamed:@"idle20.png"]                
                      , nil];
    }
    self.idleView.animationRepeatCount = 0;
    self.idleView.animationDuration = 2.0;
    [self.view addSubview:self.idleView];
    [self.view sendSubviewToBack:self.idleView];
    [self.idleView startAnimating];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...