我有一个视图,我希望通过动画来缩放并转换到新位置。我尝试使用以下代码实现它:
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:kDurationForFullScreenAnimation];
[[self animatingView] setFrame:finalRect];
[UIView commitAnimations];
此代码的效果是,视图首先将其内容的大小更改为finalRect,然后将其转换为新位置。即,缩放部分从不动画。视图只是转换为新大小然后翻译。
这个问题已在其他几个主题中讨论过,但没有一个得出结论。但是,确实存在一种解决方案,使用计时器并在计时器回调中每次设置帧,但它有性能缺陷。
对于这个问题,最合适的解决办法是什么,为什么在第一种情况下会出现这个问题呢?
由于
答案 0 :(得分: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];
其中 newRect 和 newCenter 分别是 CGRect 和 CGPoint ,它们代表屏幕上的新位置。同样,这些需要包含在动画块中。
答案 1 :(得分: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) { }
];
答案 2 :(得分: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);