15

アニメーションを含むナビゲーションバーを削除する唯一の方法は、上にスライドさせることです。私はそれがPhotos.appのように退色したい。アプリでナビゲーションバーを「法的に」フェードアウトさせるにはどうすればよいですか?

それはしかしApple's guidelines state、アルファを変更するのが最も簡単でしょう:ナビゲーション コントローラと組み合わせて使用​​する場合

前のiOSバージョン5.0に、あなたが できる直接カスタマイズのほんの一握りがありますナビゲーションバーに移動します。具体的には、 barStyle、tintColor、およびtranslucentプロパティを変更することは問題ありませんが、 は、フレーム、境界、 アルファ、または隠しプロパティなどのUIViewレベルのプロパティを直接変更してはなりません。

言語が少し変わっていますが、iOS 5より前の状態ですが、アルファ値を直接変更することはできないと言われています。

私のアプリが拒否されないようにしたい。

ステータスバーのようにナビゲーションバーをフェードアウトするにはどうすればよいですか?

+0

うーむ...どのように「[...]半透明のプロパティを変更する」ではなく「直接... [...]アルファを変更することはありません」にOKすることができ???どのように透明度を変更する*アルファを変更せずに??? – verec

+1

合意して、私は同じように混乱しています。編集:アクセスすることが許可されている '半透明な'プロパティがありますが、それは単にYESまたはNOであり、YESに設定されているのは完全に透過的ではありません。 –

+0

私はあなたが試してみると何かが壊れてしまうという警告として、あなたは拒絶の脅威としてではなく、「決してしてはいけません...」と言います。 App Storeの拒否も起こるかもしれませんが、あなたのアプリが壊れている可能性が高いということは、警告に注意を払わないための罰としてではありません。 – Caleb

答えて

6

これは楽しい解決策でした。

パブリックAPI setNavigationBarHidden:animated:で設定されているように、ナビゲーションバーの非表示と非表示の状態の間でクロスフェードを実行するには、UIView transitionWithViewを使用する必要があります。実際、これはnavbarを「フェードアウト」するために機能しますが、それを元に戻すことには問題があります。問題は、を指定しない限り、UIView +transitionWithView:がアニメーション可能なプロパティ(たとえばframe)をアニメーション化しないという事実にかかわらず、navbarが所定の位置にスライドすることでした。

私にこれは内部UINavigationControllerは関係なく、アニメーションがsetNavigationBarHidden:animated:への呼び出しで指定されたかどうかのアニメーションブロック内UINavigationBarを再配置することを言います。 animate:NOに設定されている場合、このアニメーションブロックの期間はおそらく '0'に設定されます。

解決策は、クロスフェードトランジションの前にナビゲーションバーが表示されるように設定することです(アニメーションは表示されません)。これにより、ナビゲーションバーが正しい位置でクロスフェードを開始し、クロスフェードが新しい非隠れ状態のみを表示することが保証されます。

私のサンプルプロジェクトでは、標準のシングルビューアプリケーションです。ストーリーボードには、エントリポイントであるUINavigationControllerがあります。このコントローラのUINavigationBarのバースタイルを黒の半透明に設定しました(写真アプリに似ています)。ナビゲーションコントローラのrootViewControllerは(また、写真アプリのような)境界全体を埋めるUIImageViewとシンプルUIViewControllerです。私は、ビューコントローラには、次のコードを呼び出すためにビューにUITapGestureRecognizerを追加しました:

- (IBAction) onShowHideNavbar: (id) sender 
{ 
    BOOL hide = !self.navigationController.navigationBarHidden; 

    if (!hide) 
    { 
     [self.navigationController setNavigationBarHidden: hide animated: NO]; 
    } 

    [UIView transitionWithView: self.navigationController.view 
         duration: 1 
         options: UIViewAnimationOptionTransitionCrossDissolve 
        animations: ^{ 

         [self.navigationController setNavigationBarHidden: hide animated: NO]; 
        } 
        completion: nil ]; 
} 

このすべては、私はあなたが隠しをいじりのための任意のトラブル(アップル除去比)に取得したいとは思わない、と述べましたまたはUINavigationBarのアルファ特性を直接測定することができます。ドキュメントは、UINavigationControllerによって管理されているため、これらを変更すると警告が表示されない可能性があります。しかし、私の意見ではパブリックなAPIなので、それらを使って拒否するべきではありません。

+0

UINavigationControllerのナビゲーションバーを表示非表示にすると、コンテンツビューフレームが変更されます。したがって、メインコントローラのサイズが変更されます。このコードを使用すると、2つの問題があります:まず、アニメーションが終了するまで黒い背景がナビゲーションバーの後ろに表示されます(黒い枠線で画像を使用した場合、photos.appのように見えませんでした)。 2番目:アニメーションが終了した後、メインビューは自動的にジャンプせずにアニメーションなしで自動的にリサイズされます。あまりよくない。フェードイン中でも問題があります:[link](http://youtu.be/jdChWTkPGGw) – LombaX

+0

はい、あなたは不透明なnavbarでジャンプを取得します。 Navbarを半透明の黒色に設定した場合(私が答えて言ったように)、コンテンツビューがすでにその背後にあるのでジャンプしません。完全に不透明なバーを使用する必要がある場合は、より多くの作業が必要になります。 – TomSwift

+0

あなたは正しい、私の間違い。半透明バーを使用すると、ビューはナビゲーションバーの下に広がり、アニメーション内では「ジャンプ」しません。不透明なバーでは、あなたがチャットで示唆したように、トリックがwantsFullScreenLayoutになるはずですが、何らかの理由でそれを動作させることができません – LombaX

2

私は次のビューにアニメーション化する方法や、フェードを組み込む方法を正確にはわかりませんが、現在のビューをuiimageにレンダリングし、フルスクリーンこの画像を使ったUIImageView(基本的に既存のUIViewを画像で置き換えます)画像ビューの背後に新しいビューを入れ替え、画像ビューをフェードアウトします。

イメージのUInavigationBar部分だけをトリミングして、トランジション後に消えることもできます。このようにして、アップルが拒否することなく、イメージ効果を 'UINavgationBar'に適用することができます。

+1

... –

+0

は悲しいことに、アップル制御の世界では、このようなトリックは、多くの場合、一定の効果を得るための唯一の方法です。もっと良い方法があるかもしれません、私はあなたに別のものが見つからない場合にのみあなたにアイデアを与えます。 – Bergasms

+0

b4で変更されたUIViewには、新しい「スナップショット」サポートがありますが、これは役に立ちますか? – verec

0

お読み続ける場合は、これは右のあなたの引用符の後に次の段落です:

のiOSバージョン5.0以降では、カスタマイジングインクルード」に記載されている方法を使用してバー の外観をカスタマイズすることができますすべてのナビゲーションバーの外観を プロキシ([UINavigationBar appearance])または単一のバーの外観を使用してカスタマイズすることができます。

リンク(バー外観のカスタマイズ)をクリックすると、この表示されます:



tintColor プロパティバーの外観のカスタマイズ - backgroundImageForBarMetrics:
- setBackgroundImage:forBarMetricsを:
- titleVerticalPositionAdjustmentForBarMetrics:
- setTitleVerticalPositionAdjustment:forBarMetrics:
titleTextAttributes プロパティ

だからのiOS V5.0以降で、それはリストすることができます(合法的に)変化です。フェードアウト(そして隠す)のように見えるようにするには、tintColorのアルファまたは背景の画像を再生することができるかもしれませんが、それはかなり正しいとは思わないでしょう。おそらく試みの価値がある。

1

私はこれを行うApple認定の方法は知りません。私はあなたがnavigationBarのアルファ値を変更することを拒否されるのではないかと疑いますが、あなたのように、私は確かに分かりません。

もちろん、独自のナビゲーションコントローラ/ナビゲーションバーを実装して、必要な操作を行うこともできます。これは、私がこのようなことをする必要があるときに私のアプリケーションで行ったことです。アップルはこれで全面的にうまくいっています。ボーナスポイント:アップルは、カスタムコントロールを使用する場合、レイアウトを壊さずにコントロールを必要なだけ変更することができます。これは最近、iOS(7)のさまざまなバージョンでアプリが大きく異なるように見えるアプリケーションの特定の領域で問題になっていました。

とにかく、それはあなたが合法的にUINavigationControllerのナビゲーションバーのプロパティをアニメーション化することはできません

6

...私の2セントです。
ただし、私は隠されたナビゲーションバー(あなたが好むように、特定のビューコントローラ上で常にのみ、それを隠して)とナビゲーションコントローラを示し、UINavigationBar ;-)

のあなたの「特別な」インスタンスに置き換えることができますサンプルプロジェクトを添付して(私はより速く、それを作成するために、Xcodeのテンプレートを使用):DetailViewControllerviewDidLoad方法でFakeNavBar

ルック:ここでは、最終製品on YouTubeのビデオだ

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    [self configureView]; 

    self.fakeBar = [[UINavigationBar alloc]initWithFrame:self.navigationController.navigationBar.bounds]; 


    UIBarButtonItem *back = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(back)]; 



    UINavigationItem *backItem = [[UINavigationItem alloc]initWithTitle:@"Back"]; 
    backItem.leftBarButtonItem = back; 
    [self.fakeBar pushNavigationItem:backItem animated:YES]; 

    [self.view addSubview:self.fakeBar]; 

} 

を。

+0

今*これはクールです。私が家に帰るときにそれをチェックします、ありがとう。 –

+1

これは明白な問題です。あなたの偽の「戻る」ボタンは、戻るボタン(左向き矢印なし)としてスタイルされていません。また、標準のUIViewControllerのnavigationItemプロパティ(例えば、ペン先/ストーリーボードで設定したもの)を使用する場合は、たくさんのフープをジャンプする必要があります。私はこのように車輪を再発明するファンではない。 downvoteがあなたであれば、すべての最初の – TomSwift

+1

@TomSwiftは、私は、そのような評判とあなたはdownvotesが間違った答えを与えられるべきではなく、答えをあなたが好きではないことを知っていることを期待しています。答えについては、戻るボタンは問題ではありません。ナビゲーション項目のスタックがどのように動作するかを解説の目的としていなかったので、私は主な質問にのみ焦点を合わせました。この「問題」を回避するには、通常の矢印を戻るボタンとして使用するためにナビゲーションアイテムのスタックを追加するだけで十分です。さらに、(次のコメントに続きます) – LombaX

0

することは簡単にナビゲーションバーをフェードすることができないかもしれないが、あなたは簡単に画像のナビゲーションバーのをフェードすることができます。あなたができることの1つは、nav barの画像を作成し、nav barを画像に置き換えて、アルファが0になるように画像ビューをアニメートすることです。逆も可能です。 nav barとは、には、nav barの背後にあるはずのもののイメージが消えます。

関連する問題