Navigation Controllerでは、期待どおりにNavigation Barの正しい色と位置が自動的に取得されます。
このような
ただし、モーダルビューでは、ナビゲーションバーにドラッグすると、キャリア/バッテリー情報に近すぎる最上部に配置できます。
そのため、それを下にドラッグして、自動作成された位置とどれだけ一致するかを推測できますが、色の不一致が生じます。 IBでステータスバーの設定を変更しようとしましたが、違いはありません。
モーダルビューを自動生成されたナビゲーションビューのように表示するなど、これを克服する正しい方法はありますか。
ありがとう
IOS 7でこれを克服する最良の方法は、新しいUIBarPositioningDelegate
プロトコルに準拠することです。
NavigationBarのデリゲートをView Controllerに接続し(ストーリーボードまたはコードを介してView ControllerをNavigation Barのデリゲートとして設定し)、そのプロトコルに準拠し、メソッドを実装します。
-(UIBarPosition)positionForBar:(id<UIBarPositioning>)bar { return UIBarPositionTopAttached; }
View Controllerの上部のギャップを削除できます。バーを上部エッジの20ポイント下に配置する必要があります
この問題を解決するための3つのオプションを見つけました。
オプション1:ナビゲーションバーのサイズを変更する
float currentVersion = 7.0;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= currentVersion) {
// iOS 7
self.navBar.frame = CGRectMake(self.navBar.frame.Origin.x, self.navBar.frame.Origin.y, self.navBar.frame.size.width, 64);
}
オプション2:ステータスバーを非表示にする
たとえば、ステータスバーを非表示にするモーダルビューで
このメソッドを追加
- (BOOL)prefersStatusBarHidden
{
return YES;
}
ViewDidLoadで追加
float currentVersion = 7.0;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= currentVersion) {
[self prefersStatusBarHidden];
[self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
}
else {
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
}
モーダルビューを閉じて、ステータスバーを元に戻したい場合。これをviewWillAppearに追加します
float currentVersion = 7.0;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= currentVersion) {
[self prefersStatusBarHidden];
[self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
NSLog(@"ios7");
}
else {
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide];
}
そして、これは今回はNOを返します
- (BOOL)prefersStatusBarHidden
{
return NO;
}
オプション3:ナビゲーションコントローラーに埋め込む
モーダルビューを選択し、ナビゲーションコントローラーに埋め込みます。
In Swift:
IOS 8.1およびSwiftでこれを克服する最良の方法は、新しいUIBarPositioningDelegateプロトコルに準拠することです。
NavigationBarのデリゲートをView Controllerに接続し、そのプロトコルに準拠して、メソッドを呼び出します。
func positionForBar(bar: UIBarPositioning) -> UIBarPosition {
return UIBarPosition.TopAttached
}
View Controllerの上部のギャップを削除できます。バーを上部エッジの20ポイント下に配置する必要があります。
Swift3の場合は、次を使用します。
func position(for bar: UIBarPositioning) -> UIBarPosition{
return .topAttached;
}
Navigation Controllerを作成し、それとともに表示された「Root View Controller」を削除しました。次に、Ctrlキーを押しながら、ビューの「Navigation Controller」をドラッグします(前に手動で追加したナビゲーションバーを削除します)。 Navigation Controllerを「Initial View Controller」として設定すると、今ではうまく機能します。
IOS 7でナビゲーションバーを数ピクセル下に移動しようと数回試みた後、これが最終的に機能しました。
-(void)viewWillLayoutSubviews
{
float iosVersion = 7.0;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= iosVersion) {
// iOS 7+
CGRect viewFrame = self.view.frame;
viewFrame.Origin.y += 10;
self.view.frame = viewFrame;
}
}
また、コンテンツに合わせてステータスバーの色を調整しました。
-(UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleLightContent;
}