CAKeyframeAnimation над кривой Безье останавливается (непрерывно) при расширении adBannerView
Поэтому я просто внедрил adBannerView в свое приложение (базовую игру жонглирования), которая при расширении (то есть вызывает bannerViewActionShouldBegin для делегата) заставляет CAKeyFrameAnimations на CALayers (через определенные кривые Безье) непрерывно останавливаться и вызывать animationDidStop для своего делегата. Под непрерывно я имею в виду один раз каждые 0,001 секунды.
Я уже внедрил метод паузы в мою игру, который при вызове (через действие, связанное с UIButton) устанавливает скорость CALayer каждого объекта шара равной 0.0, эффективно останавливая их в середине их анимации. Существует логическое условие, которое определяет, будет ли игра приостановлена, и определяет, какая часть кода паузы выполняется при вызове метода. Вот код:
- (IBAction)pauseButton:(id)sender {
if (isPaused == NO) {
isPaused = YES;
[_pauseButtonOutlet setImage:playButtonImage forState:UIControlStateNormal];
[_pauseButtonOutlet setImage:playButtonImage forState:UIControlStateSelected];
for (x = 0; x < [ballsArray count]; x++) {
[[ballsArray objectAtIndex:x] setTimeOffset:[[ballsArray objectAtIndex:x] convertTime:CACurrentMediaTime() fromLayer:nil]];
[[ballsArray objectAtIndex:x] setBeginTime:CACurrentMediaTime()];
[[ballsArray objectAtIndex:x] setSpeed:0.0];
}
[_statusLabel setText:@"Paused"];
} else if (isPaused == YES) {
isPaused = NO;
[_pauseButtonOutlet setImage:pauseButtonImage forState:UIControlStateNormal];
[_pauseButtonOutlet setImage:pauseButtonImage forState:UIControlStateSelected];
for (x = 0; x < [ballsArray count]; x++) {
[[ballsArray objectAtIndex:x] setTimeOffset:[[ballsArray objectAtIndex:x] convertTime:CACurrentMediaTime() fromLayer:nil]];
[[ballsArray objectAtIndex:x] setBeginTime:CACurrentMediaTime()];
[[ballsArray objectAtIndex:x] setSpeed:1.0];
}
[_statusLabel setText:@""];
}
}
Этот метод также служит (или я так подумал) удобным способом приостановить активность приложения, пока содержимое adBannerView расширено. Тем не менее, я обнаружил, что когда я вернусь к интерфейсу, мои шары CALayer будут в конце своей анимации (точка, в которой персонаж их ловит), но игра все равно будет приостановлена. Отстранение заставляет их продолжать, как будто анимация начинается заново (когда мяч приземляется, анимация останавливается, и создается новая в противоположном направлении).
Я подумал, что, возможно, что-то происходило со слоем презентации во время показа рекламы (поскольку в начале каждой анимации я перемещаю сам CALayer в конечную точку, но все же анимирую слой представления по кривой Безье от начальной точки). Но после добавления быстрой инструкции NSLog в мои методы animationDidStop (я говорю "методы", потому что всего существует четыре класса ball, каждый из которых предназначен для анимации по определенному пути, и у каждого есть свой собственный метод делегата animationDidStop), я обнаружил, что для по какой-то странной причине методы остановки для всех созданных экземпляров шаров вызываются непрерывно и с очень близкими интервалами (~ 0,001 с). Это действие прекращается, когда реклама закрывается (и я использую bannerViewActionDidFinish, чтобы снова вызвать функцию паузы, автоматически возобновляя игру).
Я хотел бы, чтобы кто-то помог мне с этим. Я сформулировал псевдо-решение (получить положение шара, когда оно приостановлено из баннера, создать массивы nsnumber для значений x и y, и после неиспользования перезапустить анимацию с точки, где они остановились с кривой Безье, контрольные точки и основные точки которой рассчитываются динамически), но это делает анимацию нерегулярной и не соответствующей стандартной анимации мяча. Я был бы очень признателен за возможность возобновить анимацию с того места, где она остановилась, как в обычном методе паузы.
Спасибо за чтение всего этого, и любая помощь очень ценится. Кроме того, если вам нужно / хотите увидеть какой-либо другой код, я был бы рад сделать это.
Обновление: после небольшого рассмотрения кода, я думаю, что отображение баннера заставляет анимацию преждевременно останавливаться, что заставляет его (шарик CALayer) вызывать метод animationDidStop для его делегата. Поскольку этот метод автоматически создает новую анимацию, создается бесконечный цикл new-stop-new-stop-new-etc. Это также объясняет, почему иногда мяч находится на стороне, противоположной той, на которой он должен был приземлиться, в то время как иногда он приземляется на ожидаемой стороне.
Из этого я понимаю, что при расширении adBannerView все CAAnimation прекращается. Если я прав по этому поводу, есть ли способ обойти это?
1 ответ
Может быть, когда вы возобновите слой, вы можете проверить, есть ли добавленная анимация. Если нет, вы можете добавить новую анимацию с правильным timeOffset.
Кроме того, есть ли причина, по которой вы не используете быстрое перечисление по сравнению с использованием для (x = 0; x <[ballsArray count]; x ++)?