草庐IT

ios - UIApplicationDidBecomeActiveNotification 和 setRightBarButtonItem :animated:

coder 2024-01-17 原文

TL;DR 更新:基本上我需要的是延迟我的代码,直到 iOS 完成其“应用程序启动”动画。

我想在我的应用程序激活时为导航栏的内容设置动画。在我的 Controller 中,我订阅了 UIApplicationDidBecomeActiveNotification 并使用 setRightBarButtonItem:animated: 来执行更改。

问题是变化不是动画的。

我做了一些实验,发现如果我稍等片刻 ([NSThread sleepForTimeInterval:.3]),它的动画效果不会有任何问题。

这是一个演示问题的简单 View Controller :

@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

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

最佳答案

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

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

关于ios - UIApplicationDidBecomeActiveNotification 和 setRightBarButtonItem :animated:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15253243/

有关ios - UIApplicationDidBecomeActiveNotification 和 setRightBarButtonItem :animated:的更多相关文章

随机推荐