10

我有一个视图,我想通过动画将其缩放并翻译到新位置。我尝试使用以下代码来实现它:

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:kDurationForFullScreenAnimation];
[[self animatingView] setFrame:finalRect];
[UIView commitAnimations];

这段代码的效果是,视图首先将其内容的大小更改为 finalRect,然后将其转换到新位置。即缩放部分从不动画。视图只是转换为新的大小,然后翻译。

这个问题已经在其他几个线程中讨论过,但没有一个得出结论。虽然确实存在一种解决方案,即使用计时器并在计时器回调中每次设置帧,但它具有性能缺陷。

这个问题最合适的解决方案是什么,为什么在第一种情况下会出现这个问题?

谢谢

4

3 回答 3

33

设置框架既不缩放也不平移。您要么使用了错误的术语,要么使用了错误的工具来完成这项工作。当您希望影响 UIView(与使用 Core Animation 变换的层相反)时,缩放和平移都使用 Core Graphics 仿射变换完成。

缩放视图使用

// 2x
[rotationView setTransform:CGAffineTransformMakeScale(2.0, 2.0)];

要翻译,请使用

// Move origin by 100 on both axis
[rotationView setTransform:CGAffineTransformMakeTranslation(100.0, 100.0)];

要为这些设置动画,请将它们包装在动画块中。如果你想用这两个转换视图,那么你需要将它们连接起来。

如果您根本不想要缩放和平移(变换),那么您的意思是您想要更改视图的边界和位置。这些随着调用而改变

[view setBounds:newRect];
[view setCenter:newCenter];

其中newRectnewCenter分别是代表屏幕上新位置的CGRectCGPoint 。同样,这些需要包含在动画块中。

于 2010-08-18T19:44:59.680 回答
15

这是块动画的示例:

CGPoint newCenter = CGPointMake(100.0,100.0);

[UIView animateWithDuration: 1
                      delay: 0
                    options: (UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction)
                 animations:^{object.center = newCenter ; object.transform = CGAffineTransformScale(CGAffineTransformIdentity, 2.0, 2.0);}
                 completion:^(BOOL finished) { }
];
于 2012-09-01T18:15:17.300 回答
5

试试这个解决方案:

  CGAffineTransform s =  CGAffineTransformMakeScale(0.5f,0.5f);
  CGAffineTransform t = CGAffineTransformMakeTranslation(100, 0);
  v2.transform = CGAffineTransformConcat(t,s); // not s,t

此操作不可交换。该顺序与使用便捷函数将一个变换应用于另一个变换时的顺序相反。

您可以使用此操作:例如(删除比例):

    v2.transform =
    CGAffineTransformConcat(CGAffineTransformInvert(s), v2.transform);
于 2014-03-11T11:53:53.947 回答