2

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

我想找到一个比阻塞线程或在固定延迟后执行更改更好的解决方案。

4

5 回答 5

4

只需dispatch_after在主队列上使用,而不是调用
+[NSThread sleepForTimeInterval:]类方法。

将您的动画作为一个块传递,它应该可以完美运行。

于 2013-03-09T21:38:34.810 回答
0

尝试转移 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActiveNotificationAction:) name:UIApplicationDidBecomeActiveNotification object:nil];viewDidLoad:方法。我认为对象UIApplicationDidBecomeActiveNotification在被触发时没有为“”注册。

于 2013-03-15T12:23:19.713 回答
0

您是否尝试过执行SelectorAfterDelay?

尝试这样的事情:

- (void)applicationDidBecomeActiveNotificationAction:(NSNotification *)notification{
     [self performSelector:@selector(yourAnimationAction) withObject:nil afterDelay:1];
}

- (void)yourAnimationAction{
    //Set your NavAnimation here
    [self.navigationItem setRightBarButtonItem:theItem animated:TRUE];
}

只需更改延迟以适合您的应用程序唤醒延迟...也许这会生效?

于 2013-03-15T11:16:57.773 回答
0

发布通知时,我不使用您的方法。

我用:

[[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];

}

希望这可以帮助!

于 2013-03-13T21:59:15.123 回答
-1

只需viewDidAppear:从您的applicationDidBecomeActiveNotificationAction:方法中手动调用。将您的动画代码放在viewDidAppear:方法中。希望这可以帮助。

于 2013-03-11T19:43:15.723 回答