Я вижу то, что кажется взаимодействием между отдельными анимациями, и я действительно буду признателен за любые предложения по устранению этого эффекта.
В основном:
У меня есть приложение для iPhone, которое включает кнопку «а» в корневом представлении. Нажатие «a» перемещает представление в стек контроллера навигации с перевернутой анимацией. Выдвинутый вид имеет кнопку, чтобы вернуть вид обратно в корень.
Базовый код:
- (IBAction)pushOneView{
TheAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationTransition: UIViewAnimationTransitionFlipFromRight
forView:delegate.navigationController.view cache:NO];
[delegate.navigationController
pushViewController:oneViewController animated:NO];
[UIView commitAnimations];
}
Кажется, это работает нормально, и анимация довольно плавная.
Корневое представление также включает в себя подпредставление ('panelView') и еще одну кнопку 'b'.
PanelView может отображать любое из двух других подпредставлений - касание перестановок «b» между этими подпредставлениями с анимацией вращения. Код:
-(IBAction)swapPanels{
UIViewController *coming;
UIViewController *going;
float rotation;
if (self.aPanel.view.superview == nil) {
coming = aPanel;
going = bPanel;
rotation = 3.14;
}
else {
coming = bPanel;
going = aPanel;
rotation = -3.14;
}
// First half of spin
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.25];
CGAffineTransform swirlTransform = CGAffineTransformMakeRotation(rotation);
panelView.transform = swirlTransform;
[panelView setAlpha:0.1];
[UIView commitAnimations];
// Finish spin
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.25];
CGAffineTransform secondTransform =
CGAffineTransformRotate(swirlTransform, rotation);
panelView.transform = secondTransform;
[panelView setAlpha:1];
[UIView commitAnimations];
// Swap the panels
[going.view removeFromSuperview];
[panelView insertSubview:coming.view atIndex:0];
}
Это также, кажется, работает нормально. Каждая из сменных панелей содержит сборщик и несколько ярлыков.
Однако я заметил, что переход 'a' становится медленным и прерывистым, если переход 'b' был выполнен до него.
Другими словами, если я запускаю приложение, запускаю «а» взад-вперед несколько раз, оно работает гладко. Затем выполните упражнение «б» взад и вперед несколько раз. Затем попробуйте снова «a» ... «a» теперь прерывисто и будет оставаться таковым до перезапуска приложения.
Это на 100% повторяется. Использование симулятора незаметно, но на устройстве это очевидно.
Я проверил на утечки - ни один не показан инструментом утечки.
Если анимация удалена из операции 'b' (просто закомментируйте шаги анимации), эффект на 'a' будет , а не , наблюдаемый после осуществления подвидения подстановки 'b'.
Если съемники снимаются с перьев сменной панели, эффект аналогичным образом устраняется.
Если для анимационного перехода «a» задано значение «кэшировать», то после «b» он не заикается посередине, а, похоже, игнорирует анимацию, просто переключая представление (это может быть вопросом восприятия).
В случае, если мне неясно: я НЕ запускаю эти отдельные операции одновременно. Анимация «a» после того, как «b» была выполнена - и завершена, - не такая, как если бы «b» никогда не выполнялась. Нужно ли проводить очистку после анимации? Является ли мой код подкачки ошибочным? Или ...?
Заранее спасибо за любые предложения.