これは楽しい解決策でした。
パブリック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なので、それらを使って拒否するべきではありません。
うーむ...どのように「[...]半透明のプロパティを変更する」ではなく「直接... [...]アルファを変更することはありません」にOKすることができ???どのように透明度を変更する*アルファを変更せずに??? – verec
合意して、私は同じように混乱しています。編集:アクセスすることが許可されている '半透明な'プロパティがありますが、それは単にYESまたはNOであり、YESに設定されているのは完全に透過的ではありません。 –
私はあなたが試してみると何かが壊れてしまうという警告として、あなたは拒絶の脅威としてではなく、「決してしてはいけません...」と言います。 App Storeの拒否も起こるかもしれませんが、あなたのアプリが壊れている可能性が高いということは、警告に注意を払わないための罰としてではありません。 – Caleb