iOS:Ken Burns动画实现需要意外的参数

时间:2011-02-26 08:29:18

标签: ios uiimageview core-animation transform coordinate-systems

我有一个UIImageView我试图动画像Ken Burns一样的平移/放大。我想开始以脸部为中心(具体地说,就是人的鼻子的末端)并缩小到图像的完整尺寸。代码类似于:

image.frame = // some frame that zooms in on the image;
image.center = // tip of the nose

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:3];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

image.frame = // original frame
image.center = // original centerpoint

[UIView commitAnimations];

在Photoshop中,鼻尖的坐标完全与我必须打入上述代码的值不同,以便在动画开始时将图像实际居中于鼻子上。我尝试过反射轴,乘以比例因子......我似乎无法弄清楚为什么iOS数字是重要的v。我从Photoshop推断出的数字。

有人可以指出两个坐标系之间的差异吗?

其他一些信息:

  • image是一个UIImageView,是UIViewController的直接子项
  • 说UIViewController水平定向 - 整个应用程序以横向模式运行。

2 个答案:

答案 0 :(得分:3)

设置帧和中心有点多余。框架应该足够了,使用你正在丢失部分设置。

编辑:更确切地说,你应该只设置两个帧,让CoreAnimation完成其余的工作。

答案 1 :(得分:2)

问题是动画以某种复杂的方式发生。无关紧要,但结果如何。您无法在一种方法中设置初始参数并为其设置动画。您必须设置初始参数,然后发送[self performSelector:withObject:afterDelay:]消息,其中将发生动画(所有[UIView *动画]消息)。

所以你的代码看起来像这样。

- (void)one {
    image.frame = // some frame that zooms in on the image;
    image.center = // tip of the nose

    [self performSelector:@selector(two) withObject:nil afterDelay:0];
}

- (void)two {
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:3];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

    image.frame = // original frame
    image.center = // original centerpoint

    [UIView commitAnimations];
}