Анимация кнопки «Назад» в UINavigationController - PullRequest
2 голосов
/ 26 июля 2010

У меня есть пользовательская кнопка на контроллере вида в иерархии контроллера навигации, которая при нажатии выскакивает видимый контроллер вида.

Я хочу использовать свойство transform UIView для анимации закрытия контроллера представления.Это работает, но если я использую `popViewControllerAnimated: YES ', левый слайд анимации по умолчанию все еще там, хотя мое пользовательское преобразование также работает.

Если я установлю popViewControllerAnimated:NO, это вообще ничего не оживляет.

Я также рассмотрел использование CATransition, которое работает, когда у меня popViewControllerAnimated установлено на NO, но нет эффекта «масштабирования», который является частью общедоступного API, и я нехочу использовать частный эффект.Пользовательские фильтры также не доступны для iPhone, только OS X.

Так что я думаю, мои вопросы:

1) Есть ли способ удалить левый слайд в переходе по умолчанию, но все ещеиметь пользовательскую анимацию, используя transform?

2) Какой-то способ использовать пользовательский фильтр для CATransition?

3) Если я использую частный API для эффекта масштабирования, насколько вероятно будетApple бросает мое приложение в корзину для мусора?

У кого-нибудь есть решение, которое я пропускаю?

1 Ответ

6 голосов
/ 02 августа 2010

Я сделал нечто похожее на то, что вы описываете, то есть изменил стандартную анимацию для pop и push-view в UINavigationController.

Идея состоит в том, чтобы отключить анимацию по умолчанию для объекта и заменить ее собственной анимацией. Я создал новую категорию для UINavigationController и использовал функцию, аналогичную приведенной ниже.

 - (void) altAnimatePopViewControllerAnimated:(BOOL)animated
 {
[CATransaction begin];

CATransition *transition;
transition = [CATransition animation];
transition.type = kCATransitionPush;          // Use any animation type and subtype you like
transition.subtype = kCATransitionFromTop;
transition.duration = 0.3;

CATransition *fadeTrans = [CATransition animation];
fadeTrans.type = kCATransitionFade;
fadeTrans.duration = 0.3;


[CATransaction setValue:(id)kCFBooleanTrue
                 forKey:kCATransactionDisableActions];

[[[[self.view subviews] objectAtIndex:0] layer] addAnimation:transition forKey:nil];
[[[[self.view subviews] objectAtIndex:1] layer] addAnimation:fadeTrans forKey:nil];



[self  popViewControllerAnimated:YES];
[CATransaction commit];
   }

чтобы использовать, просто используйте код

   [self.navigationController altAnimatePopViewControllerAnimated:YES];

Чтобы сделать толчок, просто создайте еще одну похожую функцию и поверните анимацию в обратном направлении.

Это не идеально, но работает. Когда вы выбираете разные типы анимации, поэкспериментируйте с различными подпредставлениями, составляющими навигационную панель / контроллер, чтобы сделать ее идеальной.

Взял мой довольно белый, чтобы придумать это, так что используйте его с умом:)

******* РЕДАКТИРОВАТЬ

Попробуйте заменить push-переход следующим (Сам не пробовал):

  CAKeyframeAnimation *scale = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"];
  scale.duration = duration;
  scale.values = [NSArray arrayWithObjects:[NSNumber numberWithFloat:.5f],
              [NSNumber numberWithFloat:1.2f],
              [NSNumber numberWithFloat:.85f],
              [NSNumber numberWithFloat:1.f],
              nil];

Это вызовет всплывающее окно, т. Е. Представление будет больше, прежде чем оно достигнет нужного размера. Поиграйте со значениями в массиве, чтобы управлять кривой анимации.

...