2012-01-27 7 views
1

CALayerを1つの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

関連する問題