Предотвратить анимацию при нажатии кнопки «Назад» на панели навигации? - PullRequest
15 голосов
/ 25 июня 2010

В моем приложении есть контроллер навигации, и мне не нужна анимация:

  • , чтобы предотвратить анимацию при нажатии на вид, это легко с помощью pushViewController: animated:метод

  • но когда я нажимаю кнопку "назад" в этом подпредставлении, появляется анимация!КО!Что я могу сделать, чтобы предотвратить эту анимацию?

Ответы [ 5 ]

4 голосов
/ 17 июня 2016

Это предотвращает анимацию по умолчанию.

- (void)viewWillDisappear:(BOOL)animated {
    [UIView setAnimationsEnabled: NO];
}

- (void)viewDidDisappear:(BOOL)animated {
    [UIView setAnimationsEnabled: YES];
}

В случае, если вам нужна пользовательская анимация

- (void)viewWillDisappear:(BOOL)animated {
    [UIView setAnimationsEnabled: NO];

    CATransition *transition = [CATransition animation];
    transition.duration = 0.3;
    transition.type = kCATransitionFade;
    [self.navigationController.view.layer addAnimation:transition forKey:kCATransition];
}

- (void)viewDidDisappear:(BOOL)animated {
    [UIView setAnimationsEnabled: YES];
}
3 голосов
/ 27 июня 2010

Я пришел в SO в поисках более элегантного решения, но вот как я (успешно) делал это до сих пор.

Основная идея:

  1. НЕ используйте UINavigationController; вместо этого используйте его составные части (например, UINavigationBar) и выполняйте работу самостоятельно
  2. Запустить навигационную панель для анимации параллельно с вашими собственными анимациями (или нет, если вы вообще не хотите анимировать)

Недостатки:

  1. UINavigationController обрабатывает некоторые другие вещи, такие как загрузка / выгрузка памяти, автоматически. Кроме того, он «жестко запрограммирован» во всех UIViewController - они ВСЕГДА имеют ссылку на UINavigationController, который их содержит. Стыдно выбрасывать все это только потому, что Apple не предоставляет возможности для настройки пользовательских анимаций.

Код - в зависимости от того, какой класс заменит анимацию:

UINavigationItem *backItem = [[UINavigationItem alloc] initWithTitle:@"Back"];
[navigationController.navigationBar pushNavigationItem:backItem animated:TRUE];
// next line only needed if you want a custom back anim too
navigationController.navigationBar.delegate = self;

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

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item
{
    // trigger your custom back animation here

    return TRUE;
}
3 голосов
/ 13 мая 2011

Более элегантно с категорией. Это предполагает, что объект контроллера навигации установлен в делегате приложения. Просто поместите это перед вашим @implementaion в контроллере корневого представления.

#import "AppDelegate.h"

@implementation UINavigationBar (custom)
- (UINavigationItem *)popNavigationItemAnimated:(BOOL)animated;
{

    AppDelegate *delegate = [[UIApplication sharedApplication] delegate];

    [delegate.navController popViewControllerAnimated:NO];

    return TRUE;
}


@end
2 голосов
/ 25 июня 2010

Не так, как вы, однако вы можете переопределить стандартное поведение, создав пользовательский leftBarButtonItem в вашем viewController.

UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"Back" style: UIBarButtonItemStylePlain target:self action:@selector(backButtonPressed)];
[[self navigationItem] setLeftBarButtonItem:item];
[item release];

- (void)backButtonPressed
{
    [[self navigationContoller] popViewControllerAnimated:NO];
}

Документация гласит, что вы должны только передать NO до отображения представления контроллера навигации.

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

0 голосов
/ 30 августа 2012

Я только что ответил на другой связанный вопрос, который описывает, как легко создать настраиваемую кнопку возврата, которая повторяет внешний вид стандартного элемента кнопки задней панели интерфейса пользователя iOS (iPhone / iPad) , но позволяет добавлять другие функции , Как рекомендовано в ответе сокола , в методе backButtonPressed просто добавьте:

[[self navigationController] popViewControllerAnimated:NO];
...