Как изменить анимацию Push и Pop в приложении на основе навигации - PullRequest
212 голосов
/ 07 февраля 2010

У меня есть приложение на основе навигации, и я хочу изменить анимацию анимации push и pop. Как бы я это сделал?

Изменить 2018

Было много ответов на этот вопрос, и прошло уже довольно много времени, я переизбрал ответ на то, что я считаю наиболее актуальным сейчас. Если есть кто-то, кто думает иначе, пожалуйста, дайте мне знать в комментариях

Ответы [ 25 ]

0 голосов
/ 13 августа 2010

Я нашел слегка рекурсивный способ сделать это, который работает для моих целей.У меня есть переменная экземпляра 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;
    }
}

У меня работает.

0 голосов
/ 13 июля 2012

Из примера приложения, проверьте этот вариант. https://github.com/mpospese/MPFoldTransition/

#pragma mark - UINavigationController(MPFoldTransition)

@implementation UINavigationController(MPFoldTransition)

//- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
- (void)pushViewController:(UIViewController *)viewController foldStyle:(MPFoldStyle)style
{
    [MPFoldTransition transitionFromViewController:[self visibleViewController] 
                                  toViewController:viewController 
                                          duration:[MPFoldTransition defaultDuration]  
                                             style:style 
                                        completion:^(BOOL finished) {
                                            [self pushViewController:viewController animated:NO];
                                        }
     ];
}

- (UIViewController *)popViewControllerWithFoldStyle:(MPFoldStyle)style
{
    UIViewController *toController = [[self viewControllers] objectAtIndex:[[self viewControllers] count] - 2];

    [MPFoldTransition transitionFromViewController:[self visibleViewController] 
                                  toViewController:toController 
                                          duration:[MPFoldTransition defaultDuration] 
                                             style:style
                                        completion:^(BOOL finished) {
                                            [self popViewControllerAnimated:NO];
                                        }
     ];

    return toController;
}
0 голосов
/ 23 апреля 2013

Просто используйте:

ViewController *viewController = [[ViewController alloc] init];

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];
navController.navigationBarHidden = YES;

[self presentViewController:navController animated:YES completion: nil];
[viewController release];
[navController release];
0 голосов
/ 24 июня 2019

Я знаю, что эта ветка старая, но я решил поставить свои два цента. Вам не нужно создавать собственную анимацию, есть простой (возможно, хакерский) способ сделать это. Вместо использования push создайте новый контроллер навигации, сделайте новый контроллер представления корневым контроллером представления этого контроллера nav, а затем представьте контроллер nav из исходного контроллера nav. Подарок легко настраивается с помощью множества стилей, и нет необходимости создавать собственную анимацию.

Например:

UIViewcontroller viewControllerYouWantToPush = UIViewController()
UINavigationController newNavController = UINavigationController(root: viewControllerYouWantToView)
newNavController.navBarHidden = YES;
self.navigationController.present(newNavController)

И вы можете изменить стиль презентации, как хотите.

0 голосов
/ 07 февраля 2010

Я не знаю, как можно публично изменить анимацию перехода.

Если кнопка «назад» не нужна, вы должны использовать контроллеры модального вида , чтобы иметь «толчок снизу» / «перевернуть» / « переходы "/ (≥3.2)" скручивания страницы ".


На стороне private метод -pushViewController:animated: вызывает недокументированный метод -pushViewController:transition:forceImmediate:, например, если вам нужен переход с переворота слева направо, вы можете использовать

[navCtrler pushViewController:ctrler transition:10 forceImmediate:NO];

Однако, вы не можете изменить переход «pop» таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...