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