Запретить анимацию при нажатии кнопки "Назад" на панели навигации?

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

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

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

Ответ 1

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

#import "AppDelegate.h"

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

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

    [delegate.navController popViewControllerAnimated:NO];

    return TRUE;
}


@end

Ответ 2

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

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

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

Недостатки:

  • UINavigationController обрабатывает некоторые другие вещи, такие как загрузка/выгрузка памяти, автоматически. Кроме того, он "жестко закодирован" во всех UIViewControllers - они ВСЕГДА имеют ссылку на 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

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

- (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];
}

Ответ 4

Не то, чтобы вы, однако, можете переопределить стандартное поведение, создав пользовательский 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];
}

documentation говорит, что вы должны пройти только NO до отображения диспетчера контроллера.

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

Ответ 5

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

[[self navigationController] popViewControllerAnimated:NO];