animateWithDuration не работает внутри метода делегирования GMSMapView

Я пытаюсь оживить UIView с приведенным ниже кодом, но я не понимаю, почему приведенный ниже код не работает.

Works – self.searchBar анимирует плавно // во всех, кроме указанного метода

 - (void) mapView:(GMSMapView *)mapView idleAtCameraPosition:(GMSCameraPosition *)position { [UIView animateWithDuration:.3 delay:0 options: UIViewAnimationCurveEaseOut animations:^{ [self.searchBar setFrame:CGRectMake(self.searchBar.frame.origin.x, self.searchBar.frame.origin.y - self.searchBar.frame.size.height , self.searchBar.frame.size.width, self.searchBar.frame.size.height)]; } completion:^(BOOL finished){ }]; } 

Не работает – self.searchBar перескакивает без анимации

 - (void)mapView:(GMSMapView *)mapView willMove:(BOOL)gesture { [UIView animateWithDuration:.3 delay:0.0 options: UIViewAnimationCurveEaseOut animations:^{ [self.searchBar setFrame:CGRectMake(self.searchBar.frame.origin.x, self.searchBar.frame.origin.y - self.searchBar.frame.size.height , self.searchBar.frame.size.width, self.searchBar.frame.size.height)]; } completion:^(BOOL finished){ }]; } 

Я открыл ошибку в этой проблеме с помощью Google ( https://code.google.com/p/gmaps-api-issues/issues/detail?id=10349 ), и это был их ответ:

Наше понимание заключается в том, что это происходит потому, что mapView: willMove: вызов выполняется уже в транзакции CoreAnimation. Наша предлагаемая работа – обернуть вызов UIView.animateWithDuration в dispatch_async обратно в основной поток. Что-то вроде:

dispatch_async (dispatch_get_main_queue (), ^ {// блок анимации здесь.});

Это помогает?

Размещение блока UIView.animateWithDuration внутри блока dispatch_async работало для меня.

Кроме того, этот вопрос представляет собой дубликат анимации макета iOS, игнорирует длительность при запуске GMSMapView , но у меня нет достаточной репутации, чтобы обозначить ее как таковую. Если кто-то держит оценку, следует также отметить, что обходной путь Google – это то, что Вишну предложил в своем ответе. У меня не хватило репутации, чтобы просто прокомментировать его ответ.

Использование CABasicAnimation поможет мне решить эту проблему.

В моем случае мне нужно переместить рамку UIView.

 CABasicAnimation *moveAnimation = [CABasicAnimation animationWithKeyPath:@"movePosition"]; moveAnimation.fromValue = [NSValue valueWithCGPoint:CGPointMake([viewToMove center].x, [viewToMove center].y)]; moveAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake([viewToMove center].x, y)]; moveAnimation.delegate = self; moveAnimation.duration = 1.0; moveAnimation.speed = 3.0; moveAnimation.cumulative = YES; moveAnimation.repeatCount = 1.0; moveAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; moveAnimation.removedOnCompletion = NO; moveAnimation.fillMode = kCAFillModeForwards; [viewToMove.layer addAnimation:rotationAnimation forKey:@"movePosition"]; 

Затем в

 - (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag 

сохранить новое положение viewToMove

Вы можете попытаться добавить главную очередь анимации внутри операции:

 - (void)mapView:(GMSMapView *)mapView willMove:(BOOL)gesture { [[NSOperationQueue mainQueue] addOperationWithBlock:^ { //Your animation code goes in here }]; } 
  • iOS: Зеркальное содержимое на экране
  • openURL: устарел в iOS 10
  • Как получить изображение исполнителя из MPMediaItem?
  • как установить цвет текста строки состояния (кроме белого и черного)
  • Откройте собственное приложение Snapchat из моего приложения
  • setTitleTextAttributes на UIBarButtonItem внешний прокси для разных стилей
  • iOS 7 Локальные уведомления без звука по умолчанию
  • iOS Объект C Ошибка HTTPS-запроса
  • Как обнаружить контакт SKSpriteNode, но не реагировать?
  • Константа NSLayoutConstraint не обновляется после настройки
  • Как динамически определить тип объекта Objective-C?
  • Давайте будем гением компьютера.