Botón Animar como ios button del centro de juegos

Estoy tratando de hacer que mis botones se animen como botones en el centro de juegos ios. parecen tambalearse y flotar alnetworkingedor de la pantalla como una burbuja. He intentado mover mis botones aleatoriamente en la pantalla, hacer que se muevan en un path cirular constante al mismo time, pero no es el mismo efecto.

Necesito un tipo de efecto bamboleante. cualquier idea se aprecia

La combinación de unas pocas CAKeyframeAnimations te dará el resultado. Necesita una para que la position siga un círculo, y una para cada escala (x / y), que se cronometran un poco diferente para lograr el efecto de bamboleo. Mira el ejemplo:

  UIView * view = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 50, 50)]; view.backgroundColor = [UIColor networkingColor]; view.layer.cornerRadius = view.frame.size.width/2; [self.view addSubview:view]; //create an animation to follow a circular path CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"]; //interpolate the movement to be more smooth pathAnimation.calculationMode = kCAAnimationPaced; //apply transformation at the end of animation (not really needed since it runs forever) pathAnimation.fillMode = kCAFillModeForwards; pathAnimation.removedOnCompletion = NO; //run forever pathAnimation.repeatCount = INFINITY; //no ease in/out to have the same speed along the path pathAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; pathAnimation.duration = 5.0; //The circle to follow will be inside the circleContainer frame. //it should be a frame around the center of your view to animate. //do not make it to large, a width/height of 3-4 will be enough. CGMutablePathRef curvedPath = CGPathCreateMutable(); CGRect circleContainer = CGRectInset(view.frame, 23, 23); CGPathAddEllipseInRect(curvedPath, NULL, circleContainer); //add the path to the animation pathAnimation.path = curvedPath; //release path CGPathRelease(curvedPath); //add animation to the view's layer [view.layer addAnimation:pathAnimation forKey:@"myCircleAnimation"]; //create an animation to scale the width of the view CAKeyframeAnimation *scaleX = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale.x"]; //set the duration scaleX.duration = 1; //it starts from scale factor 1, scales to 1.05 and back to 1 scaleX.values = @[@1.0, @1.05, @1.0]; //time percentage when the values above will be reached. //ie 1.05 will be reached just as half the duration has passed. scaleX.keyTimes = @[@0.0, @0.5, @1.0]; //keep repeating scaleX.repeatCount = INFINITY; //play animation backwards on repeat (not really needed since it scales back to 1) scaleX.autoreverses = YES; //ease in/out animation for more natural look scaleX.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; //add the animation to the view's layer [view.layer addAnimation:scaleX forKey:@"scaleXAnimation"]; //create the height-scale animation just like the width one above //but slightly increased duration so they will not animate synchronously CAKeyframeAnimation *scaleY = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale.y"]; scaleY.duration = 1.5; scaleY.values = @[@1.0, @1.05, @1.0]; scaleY.keyTimes = @[@0.0, @0.5, @1.0]; scaleY.repeatCount = INFINITY; scaleY.autoreverses = YES; scaleX.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; [view.layer addAnimation:scaleY forKey:@"scaleYAnimation"];