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