UIView动画 - 缩放 + 平移

10

我有一个视图,想要通过动画来缩放和平移到新的位置。我尝试使用以下代码实现:

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:kDurationForFullScreenAnimation];
[[self animatingView] setFrame:finalRect];
[UIView commitAnimations];
该代码的效果是,视图首先将其内容的大小更改为finalRect,然后将其转换到新位置。即缩放部分不参与动画。视图仅转换到新大小,然后进行平移。
这个问题已经在其他几个主题中讨论过,但没有一个得出结论。虽然存在一种解决方法,即使用计时器并在计时器回调中每次设置框架,但它会影响性能。
什么是此问题的最合适解决方案,以及为什么在第一种情况下会出现这个问题?
谢谢。
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类型。同样需要将它们包装在一个动画块中。


问题是,如果我这样做,视图及其所有子视图的内容立即采用新的矩形。它们不会动画到新的框架。比如说你有一个imageView作为动画视图的子视图,imageView中的图像不会逐渐缩放。相反,图像首先被放大到新的矩形,然后视图的边界缩放+平移。在动画块中改变中心点是有效的,但改变边界不是预期的。 - Raj Pawan Gumdal

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) { }
];

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);

2
非常好的答案。在我所有的搜索中,这个答案恰好让我找到了我需要的东西,使得这个动画能够按照我所需的方式工作。我正在尝试复制在Android上选择文本字段时看到的动画,标签会缩小并向左上方移动。只有一个比例变换会缩小标签,但是向下和向右。还需要转换变换,但我找不到同时使用两者的方法。CGAffineTransformConcat是关键。谢谢! - magnusMTB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接