2014-09-01 3 views
0

Случайно мое приложение не будет анимировать вообще. У моего приложения есть звуковая панель, которая обновляется каждые 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; 
    } 
} 
+0

Are вы загружаете любой из ваших контроллеров вида из раскадровки или наконечника? – Milo

+0

@Milo. Все не основано на коде. – kezi

+0

Если набор кадров или другой бит кода попадает в ошибку, анимация моментально завершается. Вам нужно будет выйти из системы и убедиться, что все значения фрейма - это то, что вы ожидаете. Если вы выйдете из «законченного» в завершении, я буду держать пари, что это «НЕТ». Вероятно, какая-то плохая математика в коде кадра. –

ответ

0

ОБНОВЛЕНО: Я просто неудаленный мой ответ, как это кажется один из свойств transitionTransform должны быть просто transform , Таким образом, кажется, что анимация происходит мгновенно, потому что self.transform != CGAffineTransformIdentity. Несмотря на то, что self был просмотром UINavigationController, он все еще был надзором представлений, которые я пытался оживить.

Оказывается, анимация не удаляется или удаляется в неподходящее время.

При создании анимации я добавил:

[transition setDelegate:self]; 

А потом в методе делегата:

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag{ 
    AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
    [delegate.navController.view removeTransition]; 
} 

Где removeTransition был метод категории на UIView определяется как:

- (void)removeTransition { 
    if (!CGAffineTransformIsIdentity(self.transform)) { 
     self.transform = CGAffineTransformIdentity; 
    } 
} 
Смежные вопросы