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

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

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

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

-(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

}

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


person Kim Gysen    schedule 03.08.2011    source источник


Ответы (2)


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

[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];  
person Kim Gysen    schedule 16.08.2011

Не глядя на весь поток вашей программы и не проводя никакого фактического тестирования (и я обнаружил, что при использовании 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
comment
Большое спасибо за ваш вклад! Действительно, я начал читать несколько курсов по основной анимации (иногда не так просто получить то, что вам действительно нужно), и я познакомился с методами задержки и длительности, которые могут дать мне то, что мне нужно. Я также проверю обратный метод, который вы упомянули в своих объяснениях. Честно говоря, я и раньше думал о такой возможности, как задержка, но это казалось странным, и я боялся, что это может привести к потенциальным проблемам (например, что, если система испортит время, например, из-за того, что памяти мало ресурсов? - person Kim Gysen; 12.08.2011
comment
Я не знаю, возможно ли это, но это кажется логичным). Мне немного жаль, что вы не можете просто решить сначала сделать то, а потом то (как в VBA :-)). Но я полагаю, это просто то, к чему нужно привыкнуть. Я прочитаю ссылку, которую вы мне прислали; спасибо за это и за ваши исчерпывающие объяснения по теме! Познакомить вас с моей идеей; У меня есть строка меню, похожая на док-станцию ​​Apple, с пятью кнопками. - person Kim Gysen; 12.08.2011
comment
Я хотел создать своего рода триггерный эффект для кнопки; когда вы нажимаете на нее, она издает звук цяк, похожий на триггер, а затем кнопка немного перемещается на задний план (становится меньше), а цвет также становится немного темнее. Ну, надеюсь, я туда попаду ;-) - person Kim Gysen; 12.08.2011