2010-08-25 4 views
2

J'essaye d'animer un bouton qui se déplace autour de l'écran. À tout moment, l'utilisateur peut appuyer sur le bouton. Mais le bouton ne répond pas aux touches. J'ai essayé un bloc d'animation, mais le bouton se déplace simplement immédiatement à ses coordonnées de fin, alors que le cadre montre l'animation (le bouton est appelé bulle):Est-il possible de réussir à animer un UIButton en mouvement?

[UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:5.0]; 
    CGAffineTransform newTransform = CGAffineTransformMakeScale(3, 3); 
    bubble.transform = CGAffineTransformTranslate(newTransform, 0, -460); 
    [UIView commitAnimations]; 

Alors j'ai essayé Core Animation avec l'aide de quelques-uns exemple de code (le chemin est pas important, il est juste un exemple):

CGMutablePathRef thePath = CGPathCreateMutable(); 
    CGPathMoveToPoint(thePath,NULL,15.0f,15.f); 
    CGPathAddCurveToPoint(thePath,NULL, 
          15.f,250.0f, 
          295.0f,250.0f, 
          295.0f,15.0f); 
    CAKeyframeAnimation *theAnimation=[CAKeyframeAnimation animationWithKeyPath:@"position"]; 
    theAnimation.path=thePath; 
    CAAnimationGroup *theGroup = [CAAnimationGroup animation]; 
    theGroup.animations=[NSArray arrayWithObject:theAnimation]; 
    theGroup.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; 
    theGroup.duration=15.0; 
    CFRelease(thePath); 
    [bubble.layer addAnimation:theGroup forKey:@"animatePosition"]; 

Mais les boutons ne répond toujours pas aux touches. Btw, j'ai plusieurs de ces boutons 'bulle' sur l'écran à la fois alors avoir plusieurs NSTimers simultanément actifs ne serait pas optimal.

Quelqu'un peut-il suggérer une autre approche? Dois-je peut-être animer UIImageViews et les rendre repsond à toucher? Ou aurai-je le même problème? Cela m'a énervé pendant quelques jours, donc toute aide très appréciée.

Merci :)

Michael

Répondre

1

Cela semble un peu trop compliqué pour UIKit et CoreAnimation. On dirait que vous développez quelque chose comme un jeu. Pourquoi ne pas utiliser une minuterie d'animation globale pour dire ~ 60 fps et faire votre dessin dans Quartz2D? Ensuite, pour chaque touche, vous pouvez vérifier rapidement tous les hits entre les rafraîchissements Quartz.

+0

Ouais, j'essaie vraiment de simuler beaucoup de bulles flottantes que le joueur peut faire sauter, je vais essayer cette approche - merci! – Smikey

1

Essayez animant la propriété cadre du UIView.

+0

Voulez-vous dire la propriété cadre du UIButton? J'ai essayé mais le même problème se produit - vous pouvez seulement appuyer sur le bouton quand il atteint sa destination finale ... – Smikey

+0

Eh bien, il n'y a qu'une seule solution: vous devrez gérer les événements tactiles vous-même. Lorsque l'utilisateur touche l'écran, vous devez savoir si le bouton est actuellement au point de contact, et ainsi de suite ... – tadejsv

+0

Ouch ... ce ne sera pas joli, étant donné que j'ai environ 10 boutons actifs à le même temps. Je viens de trouver un post similaire - http://stackoverflow.com/questions/2412787/how-can-i-detect-a-touch-on-an-animated-subview-or-click-an-animated- uibutton et il semble physiquement déplacer le bouton un incrément à la fois en utilisant un NSTimer devra être le moyen de le faire. Je ne sais pas trop comment je vais gérer avec plusieurs boutons simultanément, et être continuellement régénéré ... :( – Smikey

3

Lors de l'animation d'un élément GUI comme UIButton, la position réelle ne change que lorsque l'animation est terminée. Cela signifie que tout événement tactile pendant l'animation ne fonctionnera qu'au point de départ du bouton. Vous pouvez obtenir la position actuelle du bouton en accédant à PresentationLayer. Vous aurez probablement besoin d'implémenter votre propre gestion des événements, de regarder la position lorsque l'utilisateur touche l'écran, et de comparer cela aux limites que vous obtenez à partir de la couche de présentation.

+0

Ok, c'est un peu ce que j'attendais, puisque je vais avoir plusieurs de ces boutons actifs à la fois, je suppose Je vais devoir tester les limites de la couche de présentation pour tous les boutons actifs, j'espère que ce ne sera pas trop la performance, mais je vais essayer.Merci pour les suggestions! – Smikey

3

Eh bien, pour toute personne intéressée, voici ma solution qui fonctionne parfaitement bien:

- (void)startMinigame { 
    makeBubbles = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(generateRandomBubble) userInfo:nil repeats:YES]; 
    floatBubbles = [NSTimer scheduledTimerWithTimeInterval:1.0/60.0 target:self selector:@selector(floatBubbles) userInfo:nil repeats:YES]; 
} 

- (void)generateRandomBubble { 
    //Get a random image for the bubble 
    int randomIndex = arc4random()%kNumberBubbles; 
    UIImage *bubbleImage = [bubbleImages objectAtIndex:randomIndex]; 

    //Create a new bubble object and retrieve the UIButton 
    Bubble *bubble = [[Bubble alloc]initWithImage:bubbleImage andIndex:randomIndex]; 
    UIButton *bubbleButton = bubble.bubbleButton; 

    //Configure the button 
    [bubbleButton addTarget:self action:@selector(bubbleBurst:) forControlEvents:UIControlEventTouchDown]; 

    //Add the bubble to the scene 
    [self.view insertSubview:bubbleButton belowSubview:bathTub]; 
    //Add the bubble to an array of currently active bubbles: 
    [self.bubbles addObject:bubble]; 
    [bubble release]; 
} 

- (void)floatBubbles { 
    //Move every active bubble's frame according to its speed. 
    for (int i = 0; i < [bubbles count]; ++i) { 
     Bubble *bubble = [bubbles objectAtIndex:i]; 
     int bubbleSpeed = bubble.speed; 
     CGRect oldFrame = bubble.bubbleButton.frame; 
     CGRect newFrame = CGRectMake(oldFrame.origin.x, oldFrame.origin.y - bubbleSpeed, oldFrame.size.width+0.1, oldFrame.size.height+0.1); 
     bubble.bubbleButton.frame = newFrame; 
     if (bubble.bubbleButton.frame.origin.y < -100.0) { 
      [bubbles removeObject:bubble]; 
      [bubble.bubbleButton removeFromSuperview]; 
     } 
    } 
} 
+1

hey smikey Je suis sous la création de la même chose. mais ne savez pas ce que contenait votre classe de bulles. Peux-tu m'aider s'il te plaît? –