2010-08-18 248 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