2011-01-12 2 views
0

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

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

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

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

Любые идеи?

ответ

1

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

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

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

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

Две вещи, чтобы рассмотреть, хотя:

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

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

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

+0

Если я играю в кино, правильным интерфейсом будет MPMoviePlayerController? – LordCecil

+0

Да, это было бы правильно использовать. –

+0

Отлично, я дам ему выстрел сегодня вечером. Благодаря! – LordCecil