TL; DR更新:基本上我需要的是延迟我的代码,直到iOS完成其“应用程序启动”动画。UIApplicationDidBecomeActiveNotification和setRightBarButtonItem:动画:
我想在应用程序变为活动状态时为导航栏的内容添加动画。在我的控制器中,我订阅了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
我想找到比阻塞线程或执行的固定延迟后的变化的更好的解决方案。
应用程序在视图出现之前变为“活动” - 为什么不简单地将动画代码从'applicationDidBecomeActiveNotificationAction'移动到'viewDidAppear'。 – 2013-03-06 17:08:57
@rokjarc我很乐意。事情是,当我切换回应用程序时,“viewDidAppear:”没有被调用。顺便说一下,'viewDidAppear:'这个名字有点令人误解(参见http:// stackoverflow。COM /问题/ 5417318/viewdidappear - 不烧不断再-后的应用程序 - 进入 - 前景)。 – 2013-03-06 17:16:29
啊,是的。我知道我在前一段时间看到了一个解决方法。我相信它与'UINavigationController'有关(即使它没有在视图层次结构中使用)。将尝试找到它。 – 2013-03-06 17:22:37