Предотвратить анимацию при нажатии кнопки "Назад" на панели навигации?
в моем приложении есть навигационный контроллер, и я не хочу никакой анимации в нем:
чтобы предотвратить анимацию при нажатии вида, это легко, через 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
Я пришел к тому, что искал более элегантное решение, но вот как я (успешно) делал это до сих пор.
основные идеи:
- Не используйте UINavigationController; вместо этого используйте его составные части (например, UINavigationBar) и выполняйте работу самостоятельно
- триггер navbar для анимации параллельно с вашими собственными анимациями (или нет, если вы не хотите anim вообще)
в недостатки:
- 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];