2012-01-27 54 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