Взаимодействие пользователя с uiview и блоками завершения анимации

У меня есть следующий код:

[UIView animateWithDuration:2.0 delay:0.0 options:UIViewAnimationOptionAllowUserInteraction
     animations:^{
         imageView.bounds = endBounds;
     }
     completion:^(BOOL finished) {
         [UIView animateWithDuration:2.0 delay:0.5 options:UIViewAnimationOptionAllowUserInteraction
              animations:^{
                  imageView.bounds = startBounds;
              }
              completion:^(BOOL finished) {
                      [imageView removeFromSuperview];
              }];
     }];

Дополнительно у меня есть:

[imageView setUserInteractionEnabled:YES];

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

У кого-нибудь есть мысли? Я гуглил и не могу найти ответ.


person Justin Miller    schedule 03.03.2011    source источник
comment
Извините за плохое форматирование кода...   -  person Justin Miller    schedule 03.03.2011
comment
Добро пожаловать в СО. Я добавляю тег iphone к вашему вопросу (исправьте это, если я был неправ), в будущем попробуйте сначала поставить теги, которые описывают платформу и язык программирования, а после некоторые конкретные теги   -  person Igor Milla    schedule 03.03.2011
comment
Спасибо за редактирование! Очень признателен.   -  person Justin Miller    schedule 03.03.2011


Ответы (3)


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

[UIView animateWithDuration:1.0 
                      delay:0 
                    options:UIViewAnimationOptionAllowUserInteraction 
                 animations:^{ myView.alpha = 0.5; } 
                 completion:NULL];
person jammur    schedule 06.04.2011
comment
Когда задержка не равна 0, она не может принимать касания. - person Burak; 05.04.2013

Я придумал решение:

Я оборачиваю UIImageView в UIView (я подкласс UIView) с теми же границами/центральной точкой, что и изображение. Затем я прикрепляю распознаватель жестов к обертке вместо изображения. Поскольку прямоугольник/центральная точка границ обертки никогда не меняются на протяжении анимации, они всегда доступны в качестве цели жеста.

Это работает очень хорошо.

-j

person Justin Miller    schedule 07.03.2011
comment
Это буквально единственное решение на сегодняшний день. Я использую UIViewPropertyAnimator, и после анимации представления с прикрепленным к нему распознавателем жестов он по какой-то причине теряет свой распознаватель жестов. Единственный обходной путь — поместить представление, которое вы хотите анимировать, в представление контейнера и добавить распознаватель жестов в это представление контейнера. Затем вы анимируете представление (не представление контейнера). - person Saoud Rizwan; 14.01.2017

Вы видите такое же поведение, если используете:

+ [UIView setAnimationDidStopSelector:]

вместо использования блоков?

person Andrew Ebling    schedule 03.03.2011
comment
Я этого не пробовал. Это старый стиль, да? Это мой первый опыт разработки для iPhone, и я решил сначала попробовать рекомендуемый подход с блоками. Я могу попробовать это позже. - person Justin Miller; 03.03.2011
comment
Кстати, я должен был упомянуть, что startBounds — это исходный прямоугольник, когда изображение было впервые загружено, а endBounds имеет те же размеры, за исключением высоты 0 (поэтому изображение исчезает). Возможно ли, что после завершения sdk увидит ограничивающую рамку с высотой 0, предполагает, что изображение больше не видно, и отключит все взаимодействия с пользователем? - person Justin Miller; 04.03.2011
comment
Обновление: такое же поведение происходит - в том, что никакие жесты не запускаются. - person Justin Miller; 06.03.2011