3

我有一个 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 的数字与我从 Photoshop 推导出的数字相比很重要。

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

一些附加信息:

  • image是 UIImageView 并且是 UIViewController 的直接子级
  • 所述 UIViewController 是水平定向的——整个应用程序以横向模式运行。
4

2 回答 2

3

同时设置框架和中心有点多余。框架应该就足够了,同时使用你会丢失一些设置。

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

于 2011-02-26T18:32:25.230 回答
2

问题是动画以某种复杂的方式发生。多么准确并不重要,但结果就是这样。您无法通过一种方法设置初始参数并为其设置动画。您必须设置初始参数,然后发送 [self performSelector:withObject:afterDelay:] 消息,动画将在其中发生(所有 [UIView *animation] 消息)。

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

- (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];
}
于 2011-02-27T09:57:13.877 回答