UIApplicationDidBecomeActiveNotification и setRightBarButtonItem:animated:
TL;DR Update: в основном, мне нужно отложить мой код до тех пор, пока iOS не закончит свою анимацию "запуска приложения".
Я хотел бы анимировать содержимое панели навигации, когда мое приложение становится активным. В моем контроллере я подписан на UIApplicationDidBecomeActiveNotification
и использовать setRightBarButtonItem:animated:
выполнить изменение.
Проблема в том, что изменение не анимировано.
Я провел некоторые эксперименты и обнаружил, что если немного подождать ([NSThread sleepForTimeInterval:.3]
Анимация без проблем.
Вот простой контроллер представления, демонстрирующий проблему:
@interface TESTViewController ()
@property (strong, nonatomic) IBOutlet UINavigationBar *navigationBar;
@end
@implementation TESTViewController
- (void)viewDidLoad
{
[super viewDidLoad];
UINavigationItem *item = [UINavigationItem new];
UIBarButtonItem *oldItem = [[UIBarButtonItem alloc] initWithTitle:@"Old" style:UIBarButtonItemStyleBordered target:nil action:NULL];
[item setRightBarButtonItem:oldItem];
[[self navigationBar] setItems:@[item] animated:NO];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActiveNotificationAction:) name:UIApplicationDidBecomeActiveNotification object:nil];
}
- (void)applicationDidBecomeActiveNotificationAction:(NSNotification *)notification
{
// [NSThread sleepForTimeInterval:.3];
UIBarButtonItem *newItem = [[UIBarButtonItem alloc] initWithTitle:@"New" style:UIBarButtonItemStyleBordered target:nil action:NULL];
[[[self navigationBar] items][0] setRightBarButtonItem:newItem animated:YES];
}
@end
Я хотел бы найти лучшее решение, чем блокировка потока или внесение изменений после фиксированной задержки.
5 ответов
Просто использовать dispatch_after
в основной очереди вместо вызова+[NSThread sleepForTimeInterval:]
метод класса.
Передайте свою анимацию как блок, и она должна работать отлично.
Попробуйте переместить [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActiveNotificationAction:) name:UIApplicationDidBecomeActiveNotification object:nil];
в viewDidLoad:
метод. Я думаю, что объект не зарегистрирован для "UIApplicationDidBecomeActiveNotification
"пока он уволен.
Вы пытались выполнить SelectAfterDelay?
Попробуйте что-то вроде этого:
- (void)applicationDidBecomeActiveNotificationAction:(NSNotification *)notification{
[self performSelector:@selector(yourAnimationAction) withObject:nil afterDelay:1];
}
- (void)yourAnimationAction{
//Set your NavAnimation here
[self.navigationItem setRightBarButtonItem:theItem animated:TRUE];
}
Просто измените задержку, чтобы она соответствовала задержке запуска ваших приложений... может быть, это даст эффект?
При публикации уведомлений я не использую ваши методы.
Я использую:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeButton) name:@"changeButton" object:nil];
на приемном конце.
И в конце публикации, я звоню
[[NSNotificationCenter defaultCenter] postNotificationName:@"changeButton" object:nil];
Попробуйте переместить ваш код в метод:
-(void)changeButton{
UIBarButtonItem *newItem = [[UIBarButtonItem alloc] initWithTitle:@"New" style:UIBarButtonItemStyleBordered target:nil action:NULL];
[[[self navigationBar] items][0] setRightBarButtonItem:newItem animated:YES];
}
Надеюсь это поможет!
Просто позвони viewDidAppear:
вручную из вашего applicationDidBecomeActiveNotificationAction:
метод. Поместите код анимации в viewDidAppear:
метод. Надеюсь это поможет.