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

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

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

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

5 ответов


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

#import "AppDelegate.h"

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

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

    [delegate.navController popViewControllerAnimated:NO];

    return TRUE;
}


@end

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

основные идеи:

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

в недостатки:

  1. UINavigationController обрабатывает некоторые другие вещи, такие как загрузка/выгрузка памяти, автоматически. Кроме того, он" жестко закодирован " во всех UIViewControllers - они всегда имеют ссылку на UINavigationController, который их содержит. Жаль выбрасывать все это только потому, что Apple не предоставляет крючок для настройки пользовательских анимаций.

Code-в зависимости от того, какой класс берет на себя анимацию:

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

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

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

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


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

[[self navigationController] popViewControllerAnimated:NO];