Запретить анимацию при нажатии кнопки "Назад" на панели навигации?
В моем приложении есть контроллер навигации, и я не хочу в нем анимации:
-
чтобы предотвратить анимацию при нажатии вида, легко, с помощью 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];