Проблемы с UIView, animateWithDuration и beginFromCurrentState - PullRequest
2 голосов
/ 18 декабря 2010

У меня есть пользовательское представление, которое должно отслеживать местоположение пользователя. Я поместил следующий код в touchesBegan, а также в touchesMoved:

[UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
    cursorView.center = locationOfTouch;
} completion:^(BOOL finished){}];

Мне это кажется довольно простым. Я ожидаю, что представление всегда анимируется к текущему местоположению пользователя, даже если это местоположение изменяется, и представление все еще анимируется (из-за опции beginFromCurrentState).

Тем не менее, каждая анимация заканчивается полностью. Они не «переходят» на новую анимацию, нет, сначала они заканчивают, затем запускают новую анимацию.

Я пытался добавить эту строку в touchesMoved:

[cursorView.layer removeAllAnimations];

Ничего не делает. Анимация не отменена. Есть идеи?

Ответы [ 3 ]

2 голосов
/ 03 января 2011

с [cursorView.layer removeAllAnimations]; вы получаете доступ к слою вида, но вы установили анимацию не для слоя, а непосредственно для вида.
Попробуйте:

[UIView beginAnimations:nil context:NULL]
[UIView setAnimationDuration:0.2];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
cursorView.center = locationOfTouch;
[UIView commitAnimations];

и пропустите removeAllAnimationsи он должен перейти из текущего состояния.

0 голосов
/ 27 июля 2011

Технически, представление должно автоматически анимироваться со временем по умолчанию 0,25 секунды.Это то, что говорится в руководствах, однако, я в настоящее время здесь, потому что руководства не кажутся очень точными в отношении анимации.

Кроме того, вызов beginAnimations постепенно прекращается, вы можете использоватьвместо транзакции CAT

0 голосов
/ 23 декабря 2010

Похоже, это производная от другого вопроса, который вы задали, на который я только что ответил, но применима та же идея.

Вам не нужно использовать блоки для этого.Просто оберните ваш setCenter в анимацию UIView.Вот так:

[UIView beginAnimations:nil context:NULL]
[UIView setAnimationDuration:0.2f];
cursorView.center = locationOfTouch;
[UIView commitAnimations];

Имейте в виду, что 0,2 секунды довольно быстро.Может показаться, что «прыгает» на позицию.Чтобы подтвердить, установите длительность примерно на 2,0 секунды и посмотрите, оживляет ли она.

С наилучшими пожеланиями.

...