Xcode: перемещение изображения (Quartzcore) + запуск 2 IBActions, один сразу за другим в 1 клик с соблюдением времени - PullRequest
0 голосов
/ 04 августа 2011

У меня вопрос по Xcode.Я нашел учебник в сети, который позволил мне перемещать изображение по экрану.Не могли бы вы объяснить, как я могу сделать так, чтобы моя кнопка двигалась влево и обратно вправо одним щелчком мыши (я нигде не могу найти это ...), и сразу после этого запускаю другой IBAction, который позволяет мнепереключиться на другое подпредставление?(У меня уже есть этот код, естественно ...).Я пытался добавить оба IBActions в один централизованный, но, похоже, он не работал :-( В этом случае он сразу открывает подпредставление, не показывая мне анимацию.

Что я пробовал:

Код, полученный до сих пор:

-(IBAction) aMove: (id) sender{

    if (bMove == NO) {

        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:1.0];
        btnTarget.transform = CGAffineTransformMakeTranslation(-30,0);
        [UIView commitAnimations];
        bMove = YES;

    }else{

        btnTarget.transform = CGAffineTransformIdentity;
        bMove = NO;

    }

}

-(IBAction) aAnimateActivate: (id) sender {

    [self aMove:nil];
    [self targetOpenView:nil]; //Opens the subview

}

Я ценю вашу помощь! Спасибо!

Ответы [ 2 ]

2 голосов
/ 16 августа 2011

сцепление работает для объединения анимаций, и я просто поместил два блока анимаций (два из приведенного ниже) друг за другом ...:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:.3];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

CGAffineTransform transform = CGAffineTransformConcat(CGAffineTransformMakeScale(1, 1),CGAffineTransformMakeTranslation(10, -50));       
btnGuide.transform = transform;
[btnGuide setAlpha:0.0];

[UIView commitAnimations]; 

В основном реализация этого кода сделала свое дело ...Легко!Однако ... Для дальнейшей реализации мне потребовались дополнительные фрагменты кода, такие как:

[self performSelector:@selector(aGuide) withObject:self afterDelay:0.0];

(не обращайте внимания на имя селектора) и:

[NSTimer scheduledTimerWithTimeInterval:.5 target:self selector:@selector(targetOpenView:) userInfo:nil repeats:NO];  
0 голосов
/ 09 августа 2011

Не смотря на весь поток вашей программы и не проводя никакого реального тестирования (и я обнаружил, что при использовании 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, но проблема «почему это произошло сразу?» - это распространенная ошибка, когда вы начинаете понимать, как это работает. Надеюсь, что это так). объяснение помогает.)

...