CoreAnimation: запутался при проверке, закончился ли он - PullRequest
1 голос
/ 06 декабря 2011

У меня есть несколько подпредставлений NSView, которые выложены в виде сетки. Пользователь может перетаскивать подпредставления вокруг сетки, и при помощи мыши я переставляю подпредставления, вставляя перетаскиваемый вид в точку закрытия сетки, в которую он был отброшен.

Код для этого выглядит так:

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");
}
...