Ecco un esempio Xamarin iOS io uso per sbattere all'angolo di un pulsante quadrato, come un orecchio del cane (facilmente portato su Obj-C):
Metodo 1: utilizzare un'animazione rotazione con 1
per entrambi gli assi x
e y
(esempi Xamarin.iOS, ma facilmente portabile obj-c):
AnimateNotify(0.10, 0, UIViewAnimationOptions.CurveEaseOut | UIViewAnimationOptions.AllowUserInteraction | UIViewAnimationOptions.BeginFromCurrentState,() =>
{
// note the final 3 params indicate "rotate around x&y axes, but not z"
var transf = CATransform3D.MakeRotation(-1 * (nfloat)Math.PI/4, 1, 1, 0);
transf.m34 = 1.0f/-500;
Layer.Transform = transf;
}, null);
Metodo 2: sufficiente aggiungere una rotazione x-axis
e y-axis
rotazione ad una CAAnimationGroup
modo da funzionare allo stesso tempo:
AnimateNotify(1.0, 0, UIViewAnimationOptions.CurveEaseOut | UIViewAnimationOptions.AllowUserInteraction | UIViewAnimationOptions.BeginFromCurrentState,() =>
{
nfloat angleTo = -1 * (nfloat)Math.PI/4;
nfloat angleFrom = 0.0f ;
string animKey = "rotate";
// y-axis rotation
var anim = new CABasicAnimation();
anim.KeyPath = "transform.rotation.y";
anim.AutoReverses = false;
anim.Duration = 0.1f;
anim.From = new NSNumber(angleFrom);
anim.To = new NSNumber(angleTo);
// x-axis rotation
var animX = new CABasicAnimation();
animX.KeyPath = "transform.rotation.x";
animX.AutoReverses = false;
animX.Duration = 0.1f;
animX.From = new NSNumber(angleFrom);
animX.To = new NSNumber(angleTo);
// add both rotations to a group, to run simultaneously
var animGroup = new CAAnimationGroup();
animGroup.Duration = 0.1f;
animGroup.AutoReverses = false;
animGroup.Animations = new CAAnimation[] {anim, animX};
Layer.AddAnimation(animGroup, animKey);
// add perspective
var transf = CATransform3D.Identity;
transf.m34 = 1.0f/500;
Layer.Transform = transf;
}, null);