Cocoa touch UIVIew动画-缩放+;翻译

Cocoa touch UIVIew动画-缩放+;翻译,cocoa-touch,uikit,uiview,core-animation,uiviewanimation,Cocoa Touch,Uikit,Uiview,Core Animation,Uiviewanimation,我有一个视图,我想通过设置动画将其缩放并转换到新位置。我试图用以下代码实现它: [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:kDurationForFullScreenAnimation]; [[self animatingView] setFrame:finalRect]; [UIView commitAnimations]; 这段代码的作用是,视图首先将其内容的大小更改为finalRect,然

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

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:kDurationForFullScreenAnimation];
[[self animatingView] setFrame:finalRect];
[UIView commitAnimations];
这段代码的作用是,视图首先将其内容的大小更改为finalRect,然后将其转换为新位置。i、 e.缩放部分从未设置动画。视图只是转换为新大小,然后进行转换

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

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


谢谢

设置框架既不会缩放也不会平移。你要么使用了错误的术语,要么使用了错误的工具。当您希望影响UIView时,缩放和平移都是使用核心图形仿射变换完成的(与使用核心动画变换的层相反)

要缩放视图,请使用

// 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];

其中newRect和newCenter分别是CGRect和CGPoint,表示屏幕上的新位置。同样,这些需要包装在动画块中。

下面是一个块动画示例:

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) { }
];
尝试以下解决方案:

  CGAffineTransform s =  CGAffineTransformMakeScale(0.5f,0.5f);
  CGAffineTransform t = CGAffineTransformMakeTranslation(100, 0);
  v2.transform = CGAffineTransformConcat(t,s); // not s,t
此操作不是可交换的。使用方便函数将一个变换应用于另一个变换时,顺序与此相反

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


问题是,如果我这样做,视图的内容和它的所有子视图都会立即采用newRect。它们不会为新帧设置动画。就像将imageView作为动画视图的子视图一样,imageView中的图像不会逐渐缩放。相反,图像首先放大到newRect,然后视图的边界缩放+平移。虽然更改中心在动画块中有效,但是更改边界并不像预期的那样。回答得很好。在我所有的搜索中,这一次让我准确地找到了我所需要的东西,使这个动画像我所需要的那样工作。我试图复制Android上的动画,当选择一个文本字段时,标签会缩小,向上向左收缩。只需缩放变换即可缩小标签,但会向下和向右收缩。翻译转换也是必要的,但我找不到一种方法使两者都起作用。CGAffineTransformConcat是关键。谢谢
    v2.transform =
    CGAffineTransformConcat(CGAffineTransformInvert(s), v2.transform);