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
我希望找到比阻止线程或在固定延迟后执行更改更好的解决方案。
答案 0 :(得分:4)
只需在主队列中使用dispatch_after
,而不是调用
+[NSThread sleepForTimeInterval:]
类方法。
将动画作为块传递,它应该可以正常工作。
答案 1 :(得分: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];
[[[self navigationBar] items][0] setRightBarButtonItem:newItem animated:YES];
希望这有帮助!
答案 2 :(得分: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];
}
只需更改延迟以适应您的应用唤醒延迟...也许这会产生效果?
答案 3 :(得分:0)
尝试移动
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActiveNotificationAction:) name:UIApplicationDidBecomeActiveNotification object:nil];
到viewDidLoad:
方法。我认为对象在被解雇时没有注册“UIApplicationDidBecomeActiveNotification
”。
答案 4 :(得分:-1)
只需在viewDidAppear:
方法中手动拨打applicationDidBecomeActiveNotificationAction:
即可。将动画代码放在viewDidAppear:
方法中。希望这会有所帮助。