Вопрос

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

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

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

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

Итак, я предполагаю, что мои вопросы таковы:

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

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

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

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

Это было полезно?

Решение

Я сделал нечто похожее на то, что вы описываете, т.е.измените анимацию по умолчанию для pop и push просмотра в 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, просто создайте другую аналогичную функцию и измените анимацию в обратном порядке.

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

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

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

Попробуйте заменить 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];

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top