CoreAnimation:在检查它是否已经结束时感到困惑

时间:2011-12-06 19:14:54

标签: cocoa core-animation viewanimator

我有一堆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");
}

0 个答案:

没有答案