Случайно мое приложение не будет анимировать вообще. У моего приложения есть звуковая панель, которая обновляется каждые 0,1 секунды с помощью анимации. Обычно, когда я запускаю приложение, анимация будет работать все красиво и все, но потом в случайной точке, как правило, после перехода на другой контроллер представления (через setViewControllers
) он внезапно останавливает анимацию. Это не только эта анимация, но и каждая анимация в моем приложении, кроме setViewControllers
.Иногда UIView animateWithDuration происходит сразу
Вот мой код, где я называю setViewControllers
:
- (void)goToController:(GeneralViewController *)vc animate:(BOOL)animated sub:(BOOL)sub{
if(animated){
AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSMutableArray *viewController = [NSMutableArray arrayWithArray:[delegate.navController viewControllers]];
if(viewController.count > 0){
viewController[0] = vc;
}else{
[viewController addObject:vc];
}
CATransition* transition = [CATransition animation];
transition.duration = 0.2;
transition.type = kCATransitionPush;
if(sub)
transition.subtype = kCATransitionFromRight;
else
transition.subtype = kCATransitionFromLeft;
[delegate.navController.view.layer addAnimation:transition forKey:kCATransition];
[delegate.navController setViewControllers:viewController animated:FALSE];
self.colorStyle = MusicPlusColorStyleLight;
}else{
AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSMutableArray *viewController = [NSMutableArray arrayWithArray:[delegate.navController viewControllers]];
if(viewController.count > 0){
viewController[0] = vc;
}else{
[viewController addObject:vc];
}
[delegate.navController.view.layer removeAnimationForKey:kCATransition];
[delegate.navController setViewControllers:viewController animated:FALSE];
}
}
Вот код, я использую, чтобы оживить звук бар:
[UIView animateWithDuration:0.1 delay:0.0 options:UIViewAnimationCurveLinear | UIViewAnimationOptionBeginFromCurrentState
animations:^{
meterViewColor.frame = CGRectMake(0, (meterView.frameSizeHeight - (level*meterView.frameSizeHeight)), meterView.frameSizeWidth, (level*meterView.frameSizeHeight));
}
completion:nil];
Я проверил и код выполняется на главной нить. Процессор был в среднем около 10%, а память - 25 МБ. Поэтому я действительно озадачен тем, почему он иногда перестает работать. Кто-нибудь еще испытал это?
ОБНОВЛЕНИЕ: Извините, но ответ, который я написал, был неправильным. Он все еще не работает. Я удалил свой ответ, и прикрепил его ниже:
При создании анимации я добавил:
[transition setDelegate:self];
- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag{
AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[delegate.navController.view removeTransition];
}
- (void) removeTransition {
if (!CGAffineTransformIsIdentity(self.transform)) {
self.transform = CGAffineTransformIdentity;
}
}
Are вы загружаете любой из ваших контроллеров вида из раскадровки или наконечника? – Milo
@Milo. Все не основано на коде. – kezi
Если набор кадров или другой бит кода попадает в ошибку, анимация моментально завершается. Вам нужно будет выйти из системы и убедиться, что все значения фрейма - это то, что вы ожидаете. Если вы выйдете из «законченного» в завершении, я буду держать пари, что это «НЕТ». Вероятно, какая-то плохая математика в коде кадра. –