TL;DR 更新:基本上我需要延迟我的代码,直到 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
我想找到一个比阻塞线程或在固定延迟后执行更改更好的解决方案。