UIVIew动画 - 缩放+翻译

Raj*_*dal 10 cocoa-touch core-animation uikit uiview uiviewanimation

我有一个视图,我希望通过动画来缩放并转换到新位置.我尝试使用以下代码实现它:

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:kDurationForFullScreenAnimation];
[[self animatingView] setFrame:finalRect];
[UIView commitAnimations];
Run Code Online (Sandbox Code Playgroud)

此代码的作用是,视图首先将其内容的大小更改为finalRect,然后将其转换为新位置.即缩放部分从不动画.视图刚刚转换为新大小然后翻译.

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

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

谢谢

Mat*_*ong 33

设置框架既不是缩放也不是翻译.您要么使用错误的术语,要么使用错误的工具来完成工作.当您想要影响UIView时(而不是使用Core Animation变换的图层),使用Core Graphics仿射变换完成缩放和平移.

缩放视图使用

// 2x
[rotationView setTransform:CGAffineTransformMakeScale(2.0, 2.0)];
Run Code Online (Sandbox Code Playgroud)

要翻译,请使用

// Move origin by 100 on both axis
[rotationView setTransform:CGAffineTransformMakeTranslation(100.0, 100.0)];
Run Code Online (Sandbox Code Playgroud)

要为它们设置动画,请将它们包装在动画块中.如果要使用这两种方法转换视图,则需要将它们连接起来.

如果您根本不想进行缩放和转换(转换),那么您的意思是要更改视图的边界和位置.这些都是通过调用来改变的

[view setBounds:newRect];
[view setCenter:newCenter];
Run Code Online (Sandbox Code Playgroud)

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


mad*_*pig 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) { }
];
Run Code Online (Sandbox Code Playgroud)


小智 5

尝试此解决方案:

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

这个操作不是可交换的.当使用便利函数将一个变换应用于另一个变换时,顺序与顺序相反.

并且您可以使用此操作:例如(删除Scale):

    v2.transform =
    CGAffineTransformConcat(CGAffineTransformInvert(s), v2.transform);
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案.在我所有的搜索中,这个让我完全按照我需要的方式使这个动画像我需要的那样工作.我正在尝试复制Android上看到的动画,当选择标签缩小较小且向上和向左的文本字段时.只是缩放变换缩小了标签,但向下和向右缩小.还需要翻译转换,但我找不到让两者兼顾的方法.CGAffineTransformConcat是关键.谢谢! (2认同)