之前添加的动画都属于基础动画,只能将UIView的某个属性从一个值变化到另一个值。如果需要在多个值之间进行变化,就需要使用关键帧动画(keyframe animation)。关键帧动画可以包含任意一个关键帧(见图27-3),读者可将关键帧动画看成是若干个连续执行的基础动画。
图27-3 关键帧动画
关键帧动画的使用方法与基础动画类似,对应的UIView类方法是animateKeyframesWithDuration:delay:options:animations:completion:。同时,在animations:的Block对象中,还需要通过addKeyframeWithRelativeStartTime: relativeDuration:animations:方法依次添加每一个关键帧。
在BNRHypnosisViewController.m中修改drawHypnoticMessage:方法,将UILabel对象首先移动到屏幕中央,然后移动到一个随机位置。
[UIView animateWithDuration:0.5
delay:0.0
options:UIViewAnimationOptionCurveEaseIn
animations:^{
messageLabel.alpha = 1.0;
}
completion:NULL];
[UIView animateKeyframesWithDuration:1.0 delay:0.0 options:0 animations:^{
[UIView addKeyframeWithRelativeStartTime:0
relativeDuration:0.8 animations:^{
messageLabel.center = self.view.center;
}];
[UIView addKeyframeWithRelativeStartTime:0.8 relativeDuration:0.2
animations:^{
int x = arc4random() % width;
int y = arc4random() % height;
messageLabel.center = CGPointMake(x, y);
}];
} completion:NULL];
UIInterpolatingMotionEffect *motionEffect =
[[UIInterpolatingMotionEffect alloc] initWithKeyPath:@“center.x”
type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis];
animateKeyframesWithDuration:delay:options:animations:completion:中参数的使用方法与基础动画大致相同,只是基础动画的options:是UIView- AnimationOptions类型,而关键帧动画的options:是UIViewKeyframeAnimationOptions类型。另外,关键帧动画中的持续时间(duration)是整个动画的持续时间,也就是所有关键帧持续时间的总和。
addKeyframeWithRelativeStartTime:relativeDuration:animations:中的第一个参数是相对起始时间(relative start time),表示该关键帧开始执行的时刻在整个动画持续时间中的百分比,取值范围是0到1。第二个参数是相对持续时间(relative duration),表示该关键帧占整个动画持续时间的百分比,取值范围也是0到1。在本例中,第一个关键帧从0%开始(相对起始时间是0.0),持续时间是整个动画持续时间的80%(相对持续时间是0.8);第二个关键帧从80%开始(相对起始时间是0.8),持续时间是整个动画持续时间的20%(相对持续时间是0.2)。
构建并运行应用。输入一些文字后点击Done,UILabel对象首先会移动到屏幕中央,然后会随机移动到另一个位置并停止。