【发布时间】:2013-03-06 16:49:23
【问题描述】:
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
我想找到一个比阻塞线程或在固定延迟后执行更改更好的解决方案。
【问题讨论】:
-
应用程序在视图出现之前变为“活动” - 为什么不简单地将动画代码从
applicationDidBecomeActiveNotificationAction移动到viewDidAppear。 -
@rokjarc 我很乐意。问题是当我切换回应用程序时没有调用
viewDidAppear:。顺便说一句,viewDidAppear:名称有点误导(请参阅stackoverflow.com/questions/5417318/…)。 -
啊,是的。我知道我前段时间看到了一个解决方法。我相信它与
UINavigationController有关(即使它没有在视图层次结构中使用)。会尝试找到它。 -
@rokjarc 非常感谢,非常感谢!
-
我过去曾通过使用 dispatch_async(到主队列)并在该块中执行动画来解决类似的问题。它不会增加可见的延迟,也不会阻塞任何线程。不过,可能不适用于您的具体情况。
标签: ios objective-c cocoa-touch uinavigationbar uiapplication