2010-08-18 136 views
10

我有一个视图,我想通过动画将其缩放并翻译到新的位置。我试着用下面的代码来实现它:UIVIew动画 - 缩放+翻译

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

这段代码的作用是,认为第一次改变其内容的大小与finalRect,然后将其转换到新的位置。即缩放部分从不动画。该视图只是转换为新的大小,然后翻译。

此问题已在其他几个线程中讨论过,但没有一个得出结论。尽管如此,解决方案确实存在,要使用定时器并每次在定时器回调中设置帧,但它存在性能缺陷。

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

谢谢

回答

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分别代表屏幕上的新位置。再一次,这些需求包裹在一个动画块中。

+0

的事情是,如果我不喜欢这一点,展示的内容及其所有子视图立即承担newRect 。他们没有动画到新的框架。就像说你有一个imageView作为动画视图的子视图,imageView中的图像不会逐渐缩放。相反,图像首先被放到newRect上,然后视图的边界缩放+平移。尽管改变了中心在动画块中的作用,但是改变边界并不像预期的那样。 – 2010-09-02 07:36:31

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

尝试这种解决方案:

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 2015-08-31 14:56:15