3

メインビューがあります。メインビューの内部には、ボタンコンテナと表示コンテナの2つのコンテナビューがあります。これらの各コンテナの内部には、それぞれボタンと表示フィールドがあります。

つまり、メイン、サブ(コンテナー)、サブサブ(ボタンとフィールド)の3つのレベルのビューがあります。

ボタンが押されたときに、そのボタンの画像をボタン領域から表示領域にアニメーション化したいと思います。つまり、2レベル上に移動してから、2レベル下に移動する必要があります。

現在、ボタンの上にカスタムボタンのUIImageと同じUIImageを作成しています。移動して、アニメーションの最後で破棄するので、実際のボタンを変更する必要はありません(ボタンをそのままにして、再利用できるようにします)。

明らかに、このUIImageViewのcenter / bounds/frameを取得できます。

しかし、目的地の座標を決定するのに問題があります。フレームとセンターはスーパービューを基準にしていますが、それは1つ上のレベルです。目的地に到達するために正しいXオフセットとYオフセットを合計するために行うべき計算がたくさんあるようです。

これはUIViewのconvertRect:toView:またはconvertRect:fromView:のジョブですか?それらをどのように使用するか、またはそれらが実際に使用するのに適切な方法であるかどうかを判断するのに苦労しています。

ある「ネストされた」ビューから別の「ネストされた」ビューに何かを移動するという、十分に一般的な問題のようですが、検索しましたが、答えが見つかりません。

4

1 に答える 1

0

これらの convertRect メソッドは、コツをつかむのが難しいものです。ビューには subA と subB の 2 つのサブビューが含まれており、subA にはボタンが含まれており、subA から subB に移動するボタンをアニメーション化したいと考えています。メインビューを持つView Controllerでアニメーションをしましょう....

// subA is the receiver.  that's the coordinate system we care about to start
CGRect startFrame = [subA convertRect:myButton.frame toView:self.view];

// this is the frame in terms of subB, where we want the button to land
CGRect endFrameLocal = CGRectMake(10,10,70,30);
// convert it, just like the start frame
CGRect endFrame = [subB convertRect:endFrameLocal toView:self.view]; 

// this places the button in the identical location as a subview of the main view
// changing the button's parent implicitly removes it from subA
myButton.frame = startFrame;
[self.view addSubview:myButton];

// now we can animate in the view controller's view coordinates
[UIView animateWithDuration:1.0 animations:^{
    myButton.frame = endFrame;  // this frame in terms of self.view
} completion^(BOOL finished) {
    myButton.frame = endFrameLocal;  // this frame in terms of subB
    [subB addSubview:myButton];
}];
于 2012-06-26T04:37:57.437 に答える