titlelabel color buttons iphone objective-c animation core-animation uibutton

iphone - color - menu ios



¿Es posible animar con éxito un UIButton en movimiento? (4)

Intente animar la propiedad de marco de uiview.

Intento animar un botón que se mueve alrededor de la pantalla. En cualquier punto, el usuario puede presionar el botón. Pero el botón no responde a los toques. Probé un bloque de animación, pero el botón simplemente se mueve inmediatamente a sus coordenadas finales, mientras que el marco muestra la animación (el botón se llama burbuja):

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

Entonces probé Core Animation con la ayuda de un código de muestra (la ruta no es importante, es solo un ejemplo):

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"];

Pero los botones todavía no responden a los toques. Por cierto, tengo varios de estos botones ''burbuja'' en la pantalla a la vez, por lo que tener varios NSTimers activos simultáneamente no sería óptimo.

¿Alguien puede sugerir otro enfoque? ¿Debería quizás animar UIImageViews y hacer que respondan a los toques? ¿O tendré el mismo problema? Esto me ha estado desconcertando por un par de días, por lo que cualquier ayuda fue muy apreciada.

Gracias :)

Miguel


Al animar un elemento GUI como UIButton, la posición real solo cambia cuando la animación está lista. Esto significa que cualquier evento táctil durante la animación solo funcionará en el punto de inicio del botón. Puede obtener la posición mostrada actual del botón accediendo a su presentationLayer. Probablemente necesites implementar tu propio manejo de eventos, mirar la posición cuando el usuario toca la pantalla y compararla con los límites que obtienes de presentationLayer.


Esto suena demasiado complicado para UIKit y CoreAnimation. Parece que estás desarrollando algo así como un juego. ¿Por qué no utilizar un temporizador de animación global para digamos ~ 60 fps y hacer su dibujo en Quartz2D? Luego, para cada toque, puedes revisar rápidamente cualquier golpe entre las renovaciones de Quartz.


Bueno, para cualquier persona interesada, aquí está mi solución que funciona perfectamente 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]; } } }