2012-01-27 89 views
1

我想同時縮放CALayer並從一個CGrect(一個小按鈕,一個按鈕)轉換到另一個(一個更大,居中的視圖) )。基本上,這個想法是,用戶觸摸一個按鈕,並從按鈕,CALayer揭示和翻譯和擴大到最終在屏幕上居中。然後CALayer(通過另一個按鈕)縮回到按鈕的位置和大小。如何撰寫核心動畫CATransform3D矩陣,以動畫同步翻譯和縮放動畫

我通過CATransform3D矩陣對此進行動畫處理。但CALayer實際上是UIView的支持層(因爲我也需要響應者功能)。而應用我的規模或翻譯轉換單獨工作正常。兩者的連接(平移,後跟縮放)會偏移圖層的位置,以便它在收縮時不與按鈕對齊。

我的猜測是,這是因爲默認情況下CALayer錨點位於其中心。該變換首先應用翻譯,移動「大」CALayer以與其左上角的按鈕對齊。然後,當縮放發生時,由於CALayer錨點位於中心,所有方向都向下縮放。在這一點上,我的圖層是按鈕的大小(我想要的),但位置是偏移的(導致所有點向圖層中心縮小)。

有意義嗎?

所以我想弄清楚是否而不將翻譯+規模,我需要:

翻譯

變化錨點到左上角。

比例。或者,如果我應該能夠想出一些因子或常數來合併到轉換矩陣的值中,以便它轉化爲一個位置,並抵消後續縮放將抵消的位置,然後最終的立場是正確的。

有什麼想法?

回答

7

你應該發佈你的代碼。當我們看看你的代碼時,我們通常會更容易幫助你。

無論如何,這對我的作品:

- (IBAction)showZoomView:(id)sender { 
    [UIView animateWithDuration:.5 animations:^{ 
     self.zoomView.layer.transform = CATransform3DIdentity; 
    }]; 
} 

- (IBAction)hideZoomView:(id)sender { 
    CGPoint buttonCenter = self.hideButton.center; 
    CGPoint zoomViewCenter = self.zoomView.center; 
    CATransform3D transform = CATransform3DIdentity; 
    transform = CATransform3DTranslate(transform, buttonCenter.x - zoomViewCenter.x, buttonCenter.y - zoomViewCenter.y, 0); 
    transform = CATransform3DScale(transform, .001, .001, 1); 
    [UIView animateWithDuration:.5 animations:^{ 
     self.zoomView.layer.transform = transform; 
    }]; 
} 

在我的測試情況下,self.hideButtonself.zoomView具有相同的上海華。

+0

謝謝!是的..中心財產;)我完全忽略了它。關於不發佈代碼,我只是認爲它更像是一個概念性問題,所以發佈代碼不會增加太多的問題。雖然通過您的代碼,但我意識到我可以使用該屬性。再次感謝! – SaldaVonSchwartz 2012-01-27 17:43:10