2009-03-14 8 views
4

私は基本的にiPhone上のiPodアプリケーションの動作を複製しようとしています。そこでは、曲を選択すると音楽プレーヤーの表示がスライドし、ナビゲーションバーが新しい色に変わります。UINavigationBarの色を遷移させますか?

私のアプリはタブベースのアプリケーションとして設定されており、UITabBarControllerと入れ子になっており、各タブにはUINavigationControllerが入れ子になっています。各タブの各UINavigationControllerの中には、UITableViewがあります。テーブル内の項目を選択すると、pushViewControllerを使用して次のビューにスライドし、次のビューコントローラでhidesBottomBarWhenPushedを設定してタブをずらします。この動作はiPodの "Now Playing"ページに非常に近く、これはほぼ完璧です。

最終的な問題は、iPodのナビゲーションバーが青色から黒色に消えるようなナビゲーションバーの色を切り替えることができないことです。私は新しい表示が表示された後に色の変更を強制することができます(viewWillAppear)が、変更は突然で、iPodアプリケーションの動作を模倣しません。フェード効果があります。

私がここで紛失していることを知っている人はいますか?それは私がいくつかのアプリケーションで見た非常に単純で一般的なUIのようですが、それを実行する明白な方法ではないようです。

答えて

3

ステータスバーのスタイルの変更をアニメートして、かなり近いエフェクトを作成することができます。

- (void)viewWillAppear:(BOOL)animated { 
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque animated:animated]; 
    self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque; 
} 

すぐナビゲーションバースタイルの変化に気づいてきましたが、ステータスバーにアニメーションの変更はまだ移行の全体的な外観を提供しています。

+0

その効果は十分に満足している。 –

+4

ありがとうございます。コメントのみ、 'viewWillAppear'をオーバーライドすると、実装のある時点でsuperを呼び出す必要があることに注意してください。 – petert

2

あなたが探しているものより多くの解決策を調理しました。

  • UINavigationBarのカスタムサブクラスを作成します。
  • オーバーライドsetBarStyle:

コードを次のように

- (void)setBarStyle:(UIBarStyle)style { 
    //Fade our content, ie background, from one style to another 
    CATransition *transition = [[CATransition new] autorelease]; 
    transition.type = kCATransitionFade; 
    transition.duration = 0.2; 
    [self.layer addAnimation:transition forKey:@"content"]; 

    [super setBarStyle:style]; 
} 
  • IBではこのサブクラス
    • を使用するようにNAVコントローラを設定し、あなただけのインスペクタでクラスを設定することができます
9

アンドリューの答えは実際にはかなりうまく動作しますが、私はそれがよりよく動作させるために二つのことを追加します。

  1. ではなく、サブクラスのカテゴリを経由して機能を提供します。ずいぶん、ずっと面倒です。
  2. 絶対に必要なときにのみトランジションを使用してください。これは、このテクニックを使用すると、元のタイトルのテキストが消え去るのではなく、消え去るという理由があります。それは微妙ですが、バースタイルが実際に変化していないトランジション中に起こるとはるかに目立ちます。だから私はその事件を避ける。

    - (void)setBarStyle:(UIBarStyle)barStyle animated:(BOOL)animated { 
        if (animated && self.barStyle != barStyle) { 
         CATransition *transition = [CATransition animation]; 
         transition.duration = 0.2; 
         transition.timingFunction = [CAMediaTimingFunction 
          functionWithName:kCAMediaTimingFunctionEaseIn]; 
         [self.layer addAnimation:transition forKey:nil]; 
        } 
    
        [self setBarStyle:barStyle]; 
    } 
    

    そして、これは私がそれを使用する方法です::

はここに(私はUINavigationBarとUIToolbar両方のカテゴリーにそれを持っている)私のカテゴリコードだ私は実際に一緒に行ったものだ

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    [[UIApplication sharedApplication] 
     setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:YES]; 
    [self.navigationController.navigationBar 
     setBarStyle:UIBarStyleBlackTranslucent animated:YES]; 
    [self.navigationController.toolbar 
     setBarStyle:UIBarStyleBlackTranslucent animated:YES]; 
} 
関連する問題