Не глядя на весь поток вашей программы и не проводя никакого фактического тестирования (и я обнаружил, что при использовании Core Animation единственный способ убедиться, что он работает правильно, - это закодировать его и посмотреть, работает ли он) сразу возникает проблема с открытием подпредставления. потому что сразу после того, как вы вызываете свой метод "aMove"
для настройки первой анимации, поток переходит к следующей строке кода, т. е. оператору [self] targetOpenView:nil
, который немедленно открывает подпредставление и, таким образом, не позволяет показывать первую последовательность анимации. Нет паузы для ожидания завершения первой анимации. После фиксации анимация выполняется в собственном потоке, в то время как ваш код продолжает выполняться в текущем потоке (возможно, в основном потоке приложения). Это может показаться не самым разумным способом, но вы должны думать о коде, который вы пишете, как о процессе настройки анимации, которая после фиксации становится отдельной сущностью, которая может работать сама по себе (помимо вашего кода). . Преимущество реализации Apple в том, что вы можете настроить целую кучу различных анимаций, которые происходят одновременно. Одна из целей дизайна Core Animation – избавиться от необходимости обрабатывать все запуски и остановки различных анимаций программистом, а вместо этого позволить координировать анимацию с помощью различных методов delay и продолжительность или предоставление средств для наблюдения (и обработки) событий одной анимации другими анимациями.
Чтобы сделать анимацию так, как вы хотите, вам нужно будет использовать метод, который позволяет начать вторую анимацию только после того, как первая закончилась. Один из способов (предполагая, что изменение подпредставления будет настроено как сама анимация) — использовать обработчик completion:
, блок анимации, который начинается только после завершения первой анимации. Другой способ — позволить двум анимациям «начинаться вместе», но включить во вторую анимацию параметр delay:
, равный длине первой анимации. Если изменение подпредставления выполняется не с помощью анимации, а просто с помощью кода в основном потоке, вам необходимо настроить делегат анимации, который вызывается, когда в вашей анимации происходят определенные события, одно из что это завершение. Параметры передаются вашему делегату, чтобы сообщить вам, что происходит и для какой анимации.
Все это обсуждается с примерами в разделе Анимации в View Programming Guide to iOS (около 10 страниц, которые, вероятно, почти точно покажут вам, как делать то, что вы хочу):
http://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/AnimatingViews/AnimatingViews.html#//apple_ref/doc/uid/TP40009503-CH6
Кроме того, чтобы настроить первую анимацию для перемещения кнопки куда-нибудь и обратно, вы можете прочитать подтему в том же разделе упомянутого выше руководства: Реализация анимаций, которые переворачивают сами себя. Я думаю, что это был бы самый чистый способ делать то, что вы хотите.
(К вашему сведению, я лучше разбираюсь в Core Animation на стороне MacOS, чем на стороне iOS, но проблема «почему это произошло сразу?» — это распространенная ошибка при ознакомлении с тем, как это работает. Надеюсь, это объяснение поможет. )
person
Zhora
schedule
09.08.2011