У меня есть основанное на навигации приложение, и я хочу изменить анимацию поп-анимации и нажатия. Как я сделал бы это?
Редактирование 2018
Было много ответов на этот вопрос, и это было вполне некоторое время теперь, я повторно выбрал ответ на то, чему я верю, чтобы быть самым релевантным теперь. Если существует кто-либо, который думает иначе сообщенный мне в комментариях
Мне неизвестно, как можно публично изменить анимацию перехода.
Если кнопка «назад» не нужна, вам следует использовать контроллеры модального представления , чтобы иметь возможность «нажать снизу» / «перевернуть» / «затухать» / (≥3,2 ) переходы "загиб страницы".
На стороне private метод -pushViewController: animated:
вызывает недокументированный метод -pushViewController: transition: forceImmediate:
, например, если вам нужен переход слева направо, вы можете использовать
[navCtrler pushViewController:ctrler transition:10 forceImmediate:NO];
Однако вы не можете изменить «всплывающий» переход таким образом.
Использование частных звонков - плохая идея, поскольку Apple больше не одобряет приложения, которые это делают. Возможно, вы могли бы попробовать следующее:
//Init Animation
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration: 0.50];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.navigationController.view cache:YES];
//Create ViewController
MyViewController *myVC = [[MyViewController alloc] initWith...];
[self.navigationController pushViewController:myVC animated:NO];
[myVC release];
//Start Animation
[UIView commitAnimations];
Я нашел умеренно рекурсивный способ сделать это, который подходит для моих целей. У меня есть переменная экземпляра BOOL, которую я использую, чтобы заблокировать обычную всплывающую анимацию и заменить свое собственное неанимированное всплывающее сообщение. Изначально для переменной установлено значение NO. При нажатии кнопки «Назад» метод делегата устанавливает для нее значение «YES» и отправляет новое неанимированное всплывающее сообщение на панель навигации, тем самым снова вызывая тот же метод делегата, на этот раз с переменной, установленной в «YES». Если для переменной установлено значение YES, метод делегата устанавливает для нее значение NO и возвращает YES, чтобы разрешить появление неанимированного всплывающего сообщения. После возврата из второго вызова делегата мы вернемся к первому, где возвращается NO, что блокирует исходный анимированный поп! На самом деле это не так беспорядочно, как кажется. Мой метод shouldPopItem выглядит так:
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item
{
if ([[navigationBar items] indexOfObject:item] == 1)
{
[expandedStack restack];
}
if (!progPop)
{
progPop = YES;
[navBar popNavigationItemAnimated:NO];
return NO;
}
else
{
progPop = NO;
return YES;
}
}
У меня работает.