У меня есть несколько подпредставлений 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");
}