2

TL;DR 更新:基本的に必要なのは、iOS が「アプリの起動」アニメーションを終了するまでコードを遅らせることです。

アプリがアクティブになったときに、ナビゲーション バーのコンテンツをアニメーション化したいと考えています。私のコントローラーでは、サブスクライブしており、変更を実行するため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

スレッドをブロックしたり、一定の遅延後に変更を実行したりするよりも、より良い解決策を見つけたいと思います。

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

通知を投稿するとき、私はあなたの方法を使用しません。

私が使う:

[[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 に答える
0

PerformSelectorAfterDelay を試しましたか?

次のようなことを試してください:

- (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 に答える
-1

メソッドviewDidAppear:内から手動で呼び出すだけです。applicationDidBecomeActiveNotificationAction:メソッドにアニメーション コードを配置しますviewDidAppear:。お役に立てれば。

于 2013-03-11T19:43:15.723 に答える