Анимация UIImageView начинается через несколько секунд после запуска startAnimating - PullRequest
1 голос
/ 17 августа 2010

Хорошо, у меня есть следующая очень простая анимация, состоящая из 25 кадров в формате PNG. Каждый кадр имеет размер 320 × 360 и около 170 КБ. Вот код, который я использую

.h:

IBOutlet UIImageView *Animation_Normal_View;

В Интерфейсном Разработчике у меня есть UIImageView со ссылочной розеткой, указывающей на это. Все мои изображения называются normal_000_crop.png, normal_001_crop.png, normal_002_crop.png, ...

.m:

Animation_Normal = [[NSMutableArray alloc] initWithCapacity:25];
for (int i = 0; i < 25; i++)
{
  [Animation_Normal addObject:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"normal_%03d_crop.png", i] ofType:nil]]];
}

Animation_Normal_View.animationImages = Animation_Normal;
Animation_Normal_View.animationDuration = 1; // seconds
Animation_Normal_View.animationRepeatCount = 0; // 0 = loops forever
[Animation_Normal release];


[self.view addSubview:Animation_Normal_View];
[Animation_Normal_View startAnimating];

На симуляторе все выглядит хорошо, визуальная анимация запускается так же, как и запускается startAnimating.

Но на iPhone 3G с iOS 4.0.2 визуальная анимация запускается через 2-3 секунды после запуска startAnimating.

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

Любые подсказки приветствуются, даже если это совершенно иной способ анимации на основе PNG.

Спасибо.

Ответы [ 3 ]

5 голосов
/ 19 августа 2010

Это хороший вопрос, и я рассмотрю его здесь с несколькими мыслями.

Во-первых, вы загружаете серию графики общим объемом около 4 МБ. Это может занять некоторое время, особенно на более медленных (старых) устройствах.

В блоке @ interface вашего .h файла вы можете объявить два свойства, таких как:

IBOutlet UIImageView *animationViewNormal;
NSMutableArray *animationViewNormalImages;

Первый - это UIImageView, который у вас уже есть (просто переименован для лучших практик), а второй - изменяемый массив, содержащий стек изображений для просмотра изображений. Позвольте мне заявить, что если «нормальный» подразумевает состояние. Для уточнения загружаете ли вы дополнительные наборы изображений для разных состояний?

В вашем файле .m в интерфейсе @ создайте следующий метод:

- (void)loadAnimationImages;

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

В том же файле .m в реализации @ вам понадобится следующее:

- (void)loadAnimationImages {
  for (NSUInteger i = 0; i < 23; i++) {
    NSString *imageName = [NSString stringWithFormat:@"normalCrop%03u", i];
    UIImage *image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:imageName ofType:@"png"]];
    if (image) {
      [animationViewNormalImages addObject:image];
    }
  }
}

Как вы можете видеть, я переименовал PNG-файлы из normal_% 03u_crop в normalCrop% 03u, так как лучше всего ставить метку индекса в конце имени файла (также большинство приложений выводят контент таким образом). Цикл загружает изображение, проверяет, является ли оно изображением, а затем добавляет изображение в «стек изображений» в изменяемом массиве.

В init () вам понадобится следующее:

- (id)init {
  ...
  animationViewNormalImages = [[NSMutableArray alloc] init];
  ...
}

Это выделяет изменяемый массив ( animationViewNormalImages ) для хранения вашей стопки изображений для просмотра изображений.

Теперь перейдем к коду для viewDidLoad () :

- (void)viewDidLoad {
  [super viewDidLoad];
  ...
  [self loadAnimationImages];
  [animationViewNormal setAnimationImages:animationViewNormalImages];
  [animationViewNormal setAnimationDuration:1.1f];
  [animationViewNormal setAnimationRepeatCount:0];  //  0=infinite loop
  ...
}

Мы загружаем стопку изображений в изменяемый массив, затем устанавливаем свойства нашего imageView с помощью стека изображений, длительности и количества повторений.

Далее в viewDidAppear () мы запускаем анимацию просмотра изображения:

- (void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear:animated];
  ...
  [animationViewNormal startAnimating];
  ...
}

После того, как imageView анимируется как бесконечный цикл, мы должны обрабатывать его при выходе из вида в viewWillDisappear () :

- (void)viewWillDisappear:(BOOL)animated {
  [super viewWillDisappear:animated];
  ...
  [animationViewNormal stopAnimating];
  ...
}

Последнее (что должно быть вторым, что мы добавляем в файл .m ), которое мы очищаем в изменяемом массиве в dealloc () :

- (void)dealloc {
  ...
  [animationViewNormalImages release];
  [super dealloc];
}

Вот как мы с этим справляемся и работаем для нас, но опять же, мы обычно не загружаем 4 МБ изображений в память для анимации.

.PNG-файлы сжимаются при сборке приложения, и я не уверен, распаковываются ли они на лету при загрузке изображений нашего пакета ресурсов. Это логическое значение в настройках сборки свойств сборки (COMPRESS_PNG_FILES).

Для производительности вы можете рассмотреть следующее:

  • Пометить непрозрачные виды как таковые: Составление представления, содержимое которого непрозрачный требует гораздо меньше усилий, чем сочинять тот, который частично прозрачный. Чтобы сделать вид непрозрачным, содержание представления не должно содержать любую прозрачность и непрозрачное свойство вида должно быть
    установить на ДА.
  • Удалить альфа-каналы из непрозрачного PNG файлы: если каждый пиксель изображения PNG непрозрачен, удаляя альфа канал избегает необходимости смешивать слои, содержащие это изображение. это упрощает компоновку изображения значительно и улучшает рисунок производительность.

Кроме того, вы можете обнаружить, что лучше создать одно большое изображение со всеми 24 кадрами (смещение по ширине отдельного кадра), а затем загрузить его один раз. Затем, используя Core Graphics с CGContextClipToRect , просто сместите контекст изображения. Это означает больше кода, но может быть быстрее, чем при использовании стандартного метода стека.

Наконец, вы можете рассмотреть вопрос о преобразовании файлов .PNG в файлы .PVR (PVRTC). Дополнительную информацию можно найти здесь: Apple Tech QA , Apple Docs и Пример кода .

Я надеюсь, что это поможет, и, пожалуйста, проголосуйте, если это так.

Лучший, Kevin Able Pear Software

2 голосов
/ 17 августа 2010

imageWithContentsOfFile: обычно занимает много времени для обработки, особенно если файлов много (25 довольно много) и / или они большие.

Одна вещь, которую вы можете попробовать, это отключить ее для imageNamed:, т.е.

[UIImage imageNamed:[NSString stringWithFormat:@"normal_%03d_crop.png", i]]

imageNamed: обычно намного быстрее, но имеет тенденцию кэшировать изображения более или менее бесконечно.

Если загрузка изображений в память и хранение их в течение всего приложения неприемлемы, вам может потребоваться выполнить некоторые тонкие настройки, чтобы загрузить их в подходящее время и выгрузить их после их использования. Это всегда сложно и требует многопоточности, чтобы не блокировать основной пользовательский интерфейс во время загрузки. Но выполнимо. И есть примеры.

0 голосов
/ 25 ноября 2012

Загрузите эти изображения перед использованием метода анимации запуска.Я советую более простой способ: «Просто вызовите метод анимации запуска в applicationDidEnterForeground. При вызове этого не забывайте свойство alpha вашего UIImageView. Если вы установите uiimageiew.alpha = 0.01; вот так будет вызываться ваш метод анимации запуска, и пользователья не вижу эту анимацию ", поэтому больше не будет лагов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...