グリッドに配置された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");
}