2013-12-07 2 views
0

Я смотрел высоко и низко для решения этого, и я никуда не ушел.Нажатие анимационного изображения/кнопки

Я хочу разработать приложение для iOS, которое довольно простое нажатие, оживление и воспроизведение звука.

Итак, у меня была бы карта с названием фермы, и когда я нажму на овцу, она будет оживлять и издавать некоторый шум. Мне удалось добиться этого, и все это хорошо.

Моя проблема и вопрос - это возможность щелкнуть уже анимационную кнопку.

Поэтому, когда вид нагрузки я хотел бы иметь кнопки облака двигаться слева направо, в небе медленно, опять же, я уже достиг этого, используя этот код

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidLoad]; 


    [UIView animateWithDuration:8.5 
          delay:1.0 
         options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat | UIViewAnimationOptionCurveEaseInOut 
        animations:^{ 
         cloudAnimate.center = CGPointMake(-100.0, 100.0); 
        } 
        completion:NULL]; 
} 

НО, когда кнопки оживляющий из слева направо и назад они не являются кликабельными, поэтому прикосновение, которое я хочу для поворота облаков и воспроизведения звука, не работает. Я прочитал несколько других сообщений, которые говорят, что этого не может быть сделано, но у меня есть загрузка приложений на iPhone и iPad, которые делают это, чтобы кто-нибудь мог понять, как это можно достичь?

Любая помощь будет принята с благодарностью, поскольку я вытаскиваю волосы.

Заранее спасибо.

EDIT:

ИТАК благодаря комбинации ответов ниже я почти получил эту работу

Так я использую это, чтобы установить начальную CGPoint:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // Move UIView 

    cloudAnimate.center = CGPointMake(400.0, 100.0); 
} 

И чтобы оживить облако слева направо, я использую тот же код, что и у меня изначально, с небольшой настройкой:

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidLoad]; 


    [UIView animateWithDuration:8.5 
          delay:1.0 
         options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat | UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction 
        animations:^{ 
         cloudAnimate.center = CGPointMake(100.0, 100.0); 
        } 
        completion:NULL]; 

} 

И теперь вместо IBAction Я использую это:

-(void) touchesBegan:(NSSet*) touches withEvent:(UIEvent *) event { 

    CGPoint point = [[touches anyObject] locationInView:self.view]; 

    if([self.cloudAnimate.layer.presentationLayer hitTest:point]) { 

     SystemSoundID soundID; 
     NSString *soundFile = [[NSBundle mainBundle] pathForResource:@"Super_Mario_Bros_Mushroom" ofType:@"mp3"]; 

     AudioServicesCreateSystemSoundID((__bridge CFURLRef) [NSURL fileURLWithPath:soundFile], & soundID); 
     AudioServicesPlaySystemSound(soundID); 

     cloudAnimate.imageView.animationImages = [NSArray arrayWithObjects:[UIImage imageNamed:@"panda-png-chewing"],[UIImage imageNamed:@"panda-png-happy"],nil]; 

     cloudAnimate.imageView.animationDuration = 0.2; 
     cloudAnimate.imageView.animationRepeatCount = 6; 
     [cloudAnimate.imageView startAnimating]; 
    } 
} 

Так что теперь это почти то, что я хочу, но если вы попали в облако, когда он находится на отделочном CGPoint (даже если он будет продолжать перемещение) приложение аварийно завершает работу. Если я ударил его, пока он движется, он звучит и оживляется.

У любого есть какие-либо предложения относительно того, почему это так?

+1

вариант попробовать UIViewAnimationOptionAllowUserInteraction –

+0

Прочтите мой ответ на этот вопрос (http://stackoverflow.com/questions/20367526/to-set-uianimation-and-touch-event-for-uiimageview/20367619#20367619), особенно часть после редактирования. – rdelmar

ответ

3

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

Однако этот вопрос можно обойти. Вам нужно поймать событие касания и сравнить его с презентационным слоем.

-(void) touchesBegan:(NSSet*) touches withEvent:(UIEvent *) event { 

    CGPoint point = [[touches anyObject] locationInView:self.view]; 

    if([self.cloudAnimate.layer.presentationLayer hitTest:point]) { 

    //do something 
    } 
} 

Презентацию слой содержит информацию о визуальной позиции CALayer, который связан с вашим cloudAnimate.

+0

Эй, такого рода работы, я добавил свою анимацию в пространство «// делаем что-то», и теперь, когда облако движется, я могу щелкнуть по нему, и он играет звук - Удивительно. НО, когда я нажимаю конечную точку, я получаю «Прекращение с неперехваченным исключением типа NSException», и приложение отключается. Очевидно, что я делаю, но какие-то идеи? –

+0

Спасибо за твой гей Тьяго. Я нашел проблему, работа над которой выполнялась, но у меня все еще был IBAction для облачного Animation_clicked, назначенного кнопке в раскадровке. Я удалил это, и он больше не разбился. Еще раз спасибо всем - мне нужно идти, что я хочу. –

+0

Я удалил свой комментарий, чтобы сосредоточиться на том, что важно. Я рад, что вы это сделали :). Нет проблем @DanDavies. Это легче, когда кто-то уже знает трюки. Вернитесь в StackOverflow в любое время. –

2

Возможно, вы также захотите использовать UIViewAnimationOptionAllowUserInteraction.

+0

Спасибо, но это тоже не сработало. То, что все это делало, позволяло мне нажимать кнопку после остановки анимации, не позволяя мне щелкнуть, пока она движется, поэтому не уверен, почему. –

+0

Это было необходимо для ответа Тьяго на работу. –

0

Короткий ответ заключается в том, что вы не можете выбирать виды во время анимации. Причина в том, что представления фактически не перемещаются от начала до конца. Вместо этого система использует «уровень представления» в Core Animation для создания внешнего вида вашего объекта просмотра, перемещения/поворота/масштабирования/независимо.

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

У меня есть образец проекта на GitHub, который показывает, как это сделать, когда вы делаете как UIView анимации и Core Animation с CABasicAnimation (который оживляет слои, а не просмотр.)

Core Animation demo with hit testing

Смежные вопросы