我有一堆 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 项,它们都应为 (220, 25)。取而代之的是当前的读取 (29, 25)。那是我拖动的视图,我将它从第二个位置移动到第一个位置附近(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");
}