16

アニメーション付きのナビゲーション バーを削除する唯一の方法は、上にスライドすることです。Photos.app のようにフェードさせたい。

アルファを変更するのが最も簡単ですが、Apple のガイドラインには次のように記載されています

iOS v5.0 より前のバージョンでは、ナビゲーション コントローラーと組み合わせて使用​​する場合、ナビゲーション バーを直接カスタマイズできるものはごくわずかです。具体的には、barStyle、tintColor、および半透明のプロパティを変更することは問題ありませんが、フレーム、境界、アルファ、または隠しプロパティなどの UIView レベルのプロパティを直接変更してはなりません。

iOS 5 より前に述べられているように、言語は少し奇妙ですが、アルファ値を直接変更することは許可されていないと述べられており、現在許可されているとは決して述べられていません。

アプリが拒否されたくない。

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

4

6 に答える 6

13

これは解決するのが楽しいものでした。

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

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

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

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

- (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 ];
}

以上のことから、直接の隠しプロパティまたはアルファ プロパティをいじっても問題 (Apple Rejection) が発生することはないと思いますUINavigationBar。これらは UINavigationController によって管理されており、変更すると目に見えない結果が生じる可能性があるため、ドキュメントではこれらに触れないように警告しています。しかし、私の意見では、それらはパブリック API であり、それらを使用することは拒否の原因となるべきではありません。

于 2013-08-05T17:17:19.897 に答える
2

これを回避する方法 (次のビューにアニメーション化する方法や、フェードをどのように組み込みたいか正確にはわかりません) は、現在のビューを uiimage にレンダリングし、このイメージでフルスクリーンの UIImageView を作成することです(基本的に、既存の UIView をその画像に置き換えます) 新しいビューを画像ビューの後ろに入れ替えてから、画像ビューをフェードアウトします。

また、画像の UInavigationBar 部分だけを切り取って、トランジション後にフェードすることもできます。このようにして、アップルに拒否されることなく、「UINavgationBar」に画像効果を適用できます。

于 2013-07-28T23:08:57.087 に答える
1

私は、Apple がこれを行う方法を認めていないことを知っています。navigationBar のアルファ値を変更することで拒否されるとは思えませんが、あなたと同じように、確かなことはわかりません。

もちろん、何でもできる独自のナビゲーション コントローラー/ナビゲーション バーを実装することもできます。これは、このようなことをする必要があるときにアプリケーションで行ったことです。Appleはそれでまったく問題ありません。ボーナス ポイント: Apple は、カスタム コントロールを使用する場合、レイアウトを壊すことなく、好きなだけコントロールを変更できます。これは最近、iOS (7) のバージョンによってアプリの表示が大きく異なる、アプリケーションの特定の領域で問題が発生しました。

とにかく、それは私の2セントです...

于 2013-07-28T23:48:08.747 に答える
0

ナビゲーション バーを簡単にフェードできない場合がありますが、ナビゲーション バーの画像は簡単にフェードできます。したがって、ナビゲーション バーの画像を作成し、ナビゲーション バーを自分の画像に置き換えてから、アルファを 0 にして画像ビューをアニメーション化することもできます。または、その逆を行うこともできます。ナビゲーション バーの後ろにあるはずの画像がフェード インします。

于 2013-08-01T14:53:13.973 に答える
0

あなたが読み続けるなら、これはあなたの引用の直後の次の段落です:

iOS v5.0 以降では、「バーの外観のカスタマイズ」に記載されている方法を使用して、バーの外観をカスタマイズできます。外観プロキシ ([UINavigationBar 外観]) を使用して、すべてのナビゲーション バーの外観をカスタマイズするか、単一のバーだけをカスタマイズできます。

リンク (バーの外観のカスタマイズ) をクリックすると、次のように表示されます。

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

したがって、iOS v5.0 以降では、これが (合法的に) 変更できるリストです。tintColor のアルファまたは背景画像を使用していくつかのゲームをプレイして、フェードアウトしているように見せる (そして非表示にする) ことができるかもしれませんが、それが完全に正しく見えるとは思えません。おそらく試してみる価値があります。

于 2013-07-28T23:40:48.807 に答える