1

グリッドに配置されたNSViewサブビューがたくさんあります。ユーザーはグリッドの周りにサブビューをドラッグでき、mouseUpでサブビューを再配置して、ドラッグしたビューをドロップしたグリッドのクローズスポットに挿入します。

これを行うためのコードは次のようになります。

for(int x=0; x<[pagesToMoveLeft count]; x++) { 

    //get a grid location
    NSRect thisSubviewFrame = NSRectFromString([subviewCoords objectAtIndex:x]);

    //get the view to move
    NSView* viewToMove = [pagesToMoveLeft objectAtIndex:x];
    [[viewToMove animator] setFrame: thisSubviewFrame];

}

最後にチェックを実行して、すべてがきれいできれいであることを確認します(つまり、各グリッド座標にビューがあります)。これを行うには、mouseDownですべてのサブビューフレームを取得し、それらを配列に格納します。mouseUpで、アニメーションの後にcleanUpメソッドを呼び出します。ここでは、すべてのサブビューフレームを再度取得して保存します。アレイ1とアレイ2は一致しているはずですが、何かがうまくいかなかった場合は、アレイ1を使用して修正できます。

期待した結果が得られません。画面上のアイテムを移動すると、それらはすべて正しい場所にスナップします。つまり、配列1と2は等しくなければなりませんが、そうではありません。これが私のログです:

"{{25, 25}, {170, 220}}",
"{{29, 25}, {170, 220}}",
"{{390, 25}, {170, 220}}",
"{{585, 25}, {170, 220}}",
"{{755, 25}, {170, 220}}",
"{{950, 25}, {170, 220}}",
"{{25, 270}, {170, 220}}",
"{{220, 270}, {170, 220}}",
"{{390, 270}, {170, 220}}",
"{{585, 270}, {170, 220}}",
"{{755, 270}, {170, 220}}",
"{{950, 270}, {170, 220}}"
)
(
"{{25, 25}, {170, 220}}",
"{{220, 25}, {170, 220}}",
"{{390, 25}, {170, 220}}",
"{{585, 25}, {170, 220}}",
"{{755, 25}, {170, 220}}",
"{{950, 25}, {170, 220}}",
"{{25, 270}, {170, 220}}",
"{{220, 270}, {170, 220}}",
"{{390, 270}, {170, 220}}",
"{{585, 270}, {170, 220}}",
"{{755, 270}, {170, 220}}",
"{{950, 270}, {170, 220}}"
)

最初のフレームは移動後のフレーム(現在の場所)で、2番目のフレームは最初の場所です。各配列の項目2を見てください。両方とも(220、25)と表示されているはずです。代わりに、現在のものは(29、25)を読み取ります。これがドラッグしたビューです。2番目の場所から最初の場所の近くに移動しました(25、25)。29は私がmousedUpした場所です...アニメーションが機能し、ビュー2が25,25の場所にスナップされ、ビュー1がビュー2の場所に移動しました。

アニメーションはコードよりも遅いと思います。そのため、アニメーションの終了ではなく、mouseUpで場所を取得しています。CoreAnimationのドキュメントを見て、animationDidStopのようなものを使用する必要があると思いますが、それを実装する方法がわかりません。

どんな助けでもいただければ幸いです。

編集:

私はそれを考え出した -

...
for(int x=0; x<[pagesToMoveLeft count]; x++) { 

        //get a grid location
        NSRect thisSubviewFrame = NSRectFromString([subviewCoords objectAtIndex:x]);

        //get the view to move
        viewToMove = [pagesToMoveLeft objectAtIndex:x];

        CAAnimation *animation = [[viewToMove animationForKey:@"frameOrigin"] copy];
        [viewToMove setAnimations:[NSDictionary dictionaryWithObject:animation forKey:@"frameOrigin"]];
        animation.delegate = self;
        [[viewToMove animator] setFrame: thisSubviewFrame];
}

...

- (void)animationDidStop:(CAAnimation *)animation finished:(BOOL)flag  {

    NSLog(@"ok");
}
4

0 に答える 0