UIImageView Intro Animation проблема - PullRequest
0 голосов
/ 12 января 2011

Я пытаюсь создать вступительную анимацию для своего приложения для iOS, и у меня возникают проблемы с синхронизацией.В частности, я хотел бы изменить экраны после воспроизведения вступительной анимации.В настоящее время я использую UIImageView, и, похоже, нет способа сделать это.Многие вопросы, связанные с переполнением стека, говорят, что нужно использовать NSTimer или executeSelector: afterDelay, но это не точные таймеры, а в моем случае они совершенно неверны.Вот что я делаю.

  1. Установите для UILaunchImageFile значение LaunchImage.png
  2. AppDelegate выделяет IntroViewController
  3. IntroViewController.LoadView выделяет IntroView
  4. IntroView.initWithFrame выполняет следующее UIImageView * iv = iv.animationImages = iv.animationDuration = 2.0 iv.animationRepeatCount = 1 [iv startAnimating]
  5. Установить NSTimer / executeSelector: afterDelay?
  6. Когда срабатывают таймерыот IntroViewController к чему-то другому.

Если я выполню любой шаг 5 или 6, он не будет работать правильно.Он правильно воспроизводит анимацию и корректно меняет контроллер вида / представления, но время ужасно неверно.Когда вы вызываете startAnimating таким образом, он может не запускать анимацию целую секунду или две.Я предполагаю, потому что приложение все еще загружается в ресурсах так или иначе.Это время, однако, не одинаково для симулятора или всех устройств.Infact несколько прогонов на одном устройстве может иметь разные результаты.Таким образом, я не могу жестко запрограммировать некоторую задержку.

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

Есть идеи?

1 Ответ

1 голос
/ 12 января 2011

Большая задержка, которую вы наблюдаете, связана с чтением и декодированием изображений, что UIImageView делает до начала анимации.

Core Animation выполняет анимацию за вас и выполняет рисование на сервере визуализации, который находится в отдельном процессе. Помните, что то, что вы видите на экране, не обязательно представляет мгновенное изображение вашего слоя в вашем приложении: Базовая архитектура рендеринга анимации .

UIImageView не предоставляет возможности дать вам точные результаты здесь. Я бы предложил:

  1. Сделайте UIView из ваших собственных.
  2. Создайте CAKeyframeAnimation с дискретным режимом расчета и вашими изображениями CGImageRefs в качестве его значений.
  3. Установите делегата анимации на IntroViewController.
  4. Добавьте анимацию к слою вашего представления для клавиши «содержимое».
  5. Ваш IntroViewController получит animationDidStop: закончено: когда это будет сделано.

Однако следует учитывать две вещи:

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

Во-вторых, и, что более важно, это решение улучшит временную ситуацию, но не полностью ее уменьшит. animationDidStop:finished: вызывается, когда ваше приложение думает, что анимация завершена ... что не обязательно точно, когда оно кажется законченным.

Вам будет лучше, если вы не будете полагаться на обратные вызовы делегатов для синхронизации мультимедиа: вместо этого добавьте эту анимацию и анимацию, изменяющую ваши представления (при необходимости CAAnimationGroup) в том же поворот цикла выполнения. Задержка последнего на beginTime от продолжительности первой анимации. В зависимости от того, что вы делаете, вам может потребоваться установить режим заполнения второй анимации, чтобы получить правильное поведение во время первой.

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