TL;DR 更新:基本的に必要なのは、iOS が「アプリの起動」アニメーションを終了するまでコードを遅らせることです。
アプリがアクティブになったときに、ナビゲーション バーのコンテンツをアニメーション化したいと考えています。私のコントローラーでは、サブスクライブしており、変更を実行するためUIApplicationDidBecomeActiveNotification
に使用setRightBarButtonItem:animated:
しています。
問題は、変更がアニメーション化されないことです。
いくつかの実験を行ったところ、少し待つと ( [NSThread sleepForTimeInterval:.3]
)、問題なくアニメーション化されることがわかりました。
問題を示す簡単なView Controllerを次に示します。
@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
スレッドをブロックしたり、一定の遅延後に変更を実行したりするよりも、より良い解決策を見つけたいと思います。