Анимации UIView мешают сенсорным событиям - PullRequest
0 голосов
/ 02 января 2011

Мое приложение состоит из картоподобного интерфейса и не должно делать ничего, кроме демонстрации автоматического маршрута.

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

Анимация работает хорошо, но как только пользователь касается экрана (случайно и т. д.), анимации полностью теряются с неправильной скоростьюи может закончить мерцание как сумасшедший.

Во-первых, 2 примера кода:

    [UIView animateWithDuration:POINT_MOVEMENT_DURATION
                          delay:POINT_MOVEMENT_DELAY
                        options:UIViewAnimationOptionCurveEaseInOut
                     animations:^{
                         self.currentPosition.center = mp.point;
                     }
                     completion:^(BOOL finished){
                         NSLog(@"finished animation: %i", finished); 

                         [self nextPoint:nil];
                     }
     ];

nextPoint - это функция для перехода к следующей точке.mp - это переменная, хранящая пиксельные координаты на экране.

Теперь при запуске этого кода аниматин будет работать плавно, как видно в журналах:

2011-01-02 15:32:11.006 MAP Player[2258:307] finished animation: 1
2011-01-02 15:32:14.008 MAP Player[2258:307] finished animation: 1
2011-01-02 15:32:17.011 MAP Player[2258:307] finished animation: 1

Как толькоЯ касаюсь экрана, это переключится на 0.

2011-01-02 15:32:26.642 MAP Player[2258:307] finished animation: 0
2011-01-02 15:32:26.647 MAP Player[2258:307] finished animation: 0
2011-01-02 15:32:26.653 MAP Player[2258:307] finished animation: 0

И в этот момент предмет будет мерцать / двигаться быстро, в неправильном направлении и т. Д.

Я нашел одинвещь: В ViewController после установки [self.view setUserInteractionEnabled:NO]; мерцание не может повториться, поэтому оно определенно связано с взаимодействием с пользователем.Он также не зависит от SingleTouch / MultiTouch.

Как создать анимацию, не зависящую от касания?Я думал добавить вызов setUserInteractionEnabled в респонденты анимации.Но это не кажется правильным?

Ответы [ 2 ]

0 голосов
/ 07 января 2011

setUserInteractionEnabled действительно правильный пример. Вероятно, с этим связан пример MoveMe от Apple. Они также используют вызов setUserInteractionDisabled. Я думаю, что ключевой вопрос заключается в том, чтобы четко понять, где находится ваш взгляд, какие анимации запускаются, как и что произойдет, когда они завершатся. И полезно знать правильные функции для отмены / остановки анимации таким образом, чтобы они не генерировали больше событий.

Кроме того, для моего примера мне пришлось добавить кнопку «Назад» в интерфейс, что означает, что я также могу каким-то образом покинуть контроллер. Да, это не простой стандарт UINavigationController из-за пользовательского интерфейса.

Итак, чтобы кнопка все еще работала, мне пришлось нажать на нее вверх, чтобы посмотреть суперпредставление self.view:

[self.backButton removeFromSuperview];
[self.view.superview addSubview:self.backButton];

И теперь я могу наслаждаться хорошей анимацией и без помех. Но подождите, когда анимация действительно запущена, я все же должен отключить взаимодействие с пользователем для кнопки. Это просто потому, что когда анимация заканчивается, она пытается получить доступ к члену, который к этому времени мог быть dealloc 'или удален. Я попытаюсь позвонить в следующий раз:

[self.view.layer removeAllAnimations];
0 голосов
/ 02 января 2011

Вы можете просто держать переменную, что-то вроде animationStarted, и не запускать анимацию, пока другая находится в процессе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...