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

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

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

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


person Dirty Henry    schedule 25.06.2010    source источник
comment
Почему вы хотите нарушить пользовательский интерфейс нестандартным поведением?   -  person Dave DeLong    schedule 25.06.2010
comment
Дело не в том, что я хочу нарушить пользовательский интерфейс нестандартным поведением. Я просто не понимаю, почему в SDK есть элемент управления для анимации push или нет, но нет такого же элемента управления для pop. Я считаю, что это непоследовательно.   -  person Dirty Henry    schedule 29.06.2010
comment
нестандартное поведение заставляет расти :)   -  person Zac    schedule 15.04.2014


Ответы (5)


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

#import "AppDelegate.h"

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

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

    [delegate.navController popViewControllerAnimated:NO];

    return TRUE;
}


@end
person Martin    schedule 12.05.2011
comment
Спасибо за ваш ответ, я только что попробовал, и он действительно работает, но это удивительно, потому что вы возвращаете TRUE для чего-то, ожидающего UINavigationItem. - person Dirty Henry; 20.05.2011
comment
Кроме того, это решение работает, если в вашем приложении 1 и только 1 контроллер навигации. Он не будет работать с несколькими контроллерами навигации. - person Dirty Henry; 20.05.2011
comment
это просто прыгает над моей головой. Пожалуйста, объясните. я новенький. Thals - person Abdul Yasin; 07.03.2014
comment
Категория добавляет или заменяет методы в классе. Этот метод категории заменяет - (UINavigationItem *) popNavigationItemAnimated: (BOOL) анимированным; метод и меняет поведение. - person Martin; 08.03.2014
comment
-1 за использование ИСТИНА вместо ДА. Кстати, тип возвращаемого значения - UINavigationsItem *, а не логическое значение. - person nalexn; 06.04.2014
comment
Немного резковато - ›stackoverflow.com/questions/615702/. И зачем создавать что-то, что, как вы знаете, будет проигнорировано? - person Martin; 07.04.2014
comment
@Martin есть ли способ быстро достичь этого? - person George Asda; 20.03.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];
}
person Evgeny Karpov    schedule 17.06.2016

Я пришел в 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;
}
person Adam    schedule 27.06.2010
comment
Спасибо за Ваш ответ ! Но вы правы: мне лень отбросить все возможности UINavigationController, и я предпочитаю позволить анимации происходить;) - person Dirty Henry; 29.06.2010
comment
*** Завершение работы приложения из-за неперехваченного исключения «NSInternalInconsistencyException», причина: «Невозможно вручную установить делегат на UINavigationBar, управляемый контроллером». - person János; 16.06.2012
comment
Что здесь происходит. я ничего не мог понять. пожалуйста, помогите мне кто-нибудь - person Abdul Yasin; 07.03.2014

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

person falconcreek    schedule 25.06.2010
comment
В этом коде есть ошибки, и даже тогда он работает только частично. Вы не получите кнопку в виде стрелки. Опечатка в вашем коде - отсутствует] в строке 1. Кроме того, ваш код в строке 2 неверен - я считаю, что он должен читать: [self.navigationItem setLeftBarButtonItem: item]; w.r.t. приемлемо ли это для Apple: 1. Это неправда - многие приложения, нарушающие HIG, принимаются; многие из собственных приложений Apple грубо нарушают его. 2. Каждый раз, когда вы хотите создать пользовательскую пару анимации push / pop, вам НЕОБХОДИМО отключить анимацию по умолчанию (поскольку Apple не предоставляет общедоступный API для ее замены). - person Adam; 27.06.2010
comment
Спасибо за Ваш ответ. Тем не менее, я согласен с Адамом: форма стрелки ОБЯЗАТЕЛЬНА в приложении для iPhone. - person Dirty Henry; 29.06.2010
comment
Вы всегда можете воссоздать изображение стрелки. Я думаю, что это довольно распространенная практика, поскольку Apple не дает вам возможности сделать это программно. - person livingtech; 12.03.2011

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

[[self navigationController] popViewControllerAnimated:NO];
person Victor Van Hee    schedule 30.08.2012