アプリには、ストーリーボードでナビゲーションバーがドラッグされたView Controllerがあります。 iOS 6では正常に機能していましたが、iOS 7では次のようになります。
ステータスバーとナビゲーションバーが互いに衝突しないようにします。スタックオーバーフローに関するこのような質問をたくさん見ましたが、それらは私にはあまり役に立ちませんでした。
いくつかの質問は、「self.edgesForExtendedLayout = UIRectEdgeNone;」を使用する必要があると言っています。しかし、うまくいきませんでした。ナビゲーションバーを削除して、プログラムの実装方法のために実行できないNavigation Controller内に埋め込む必要があると言う人もいます。一部のソリューションでは、ビューの境界とすべてを使用することを提案していますが、それでもうまくいきませんでした。
この問題を解決するのに役立つ1つのことは何ですか。前もって感謝します!
PDATE:ビューコントローラーをuinavigationコントローラー内に埋め込みました。以前に手動で追加されたナビゲーションバーを削除しました。ストーリーボードでは正常に見えますが、実行すると次のように表示されます。
現在、その背後にある別のView Controller、つまりその親View Controllerからのテキストを表示しています。透明になりました。誰かが私が間違っていることを指摘できますか?
IOSの最新バージョンは多くの視覚的な変更をもたらし、開発者の観点から見ると、ナビゲーションとステータスバーは2つの顕著な変更です。
ステータスバーが透明になり、その後ろのナビゲーションバーが透けて見えます。ナビゲーションバーの画像は、ステータスバーの背後に拡張することもできます。
まず、初心者でiOS開発を始めたばかりで、ステータスバーとナビゲーションバーの動作が混乱している場合は、 [〜#〜]こちら[〜 #〜] とても便利だと思いました。 iOS 7のナビゲーションとステータスバーに関連するすべての情報が含まれています。
今、あなたの質問の答えに来ています。まず第一に、2つの異なる問題を見ることができます。 1つは、質問で画像に示されているように、ステータスバーとナビゲーションバーの両方が互いに衝突しているということです。
問題:まあ問題は、iOS 6で正しく機能していたがiOS 7の到来とともに、View Controllerのナビゲーションバーを以前にドラッグしたことですSDKでは、このアプローチにより、ステータスバーとナビゲーションバーが互いに重複します。
最初の問題の解決策:UIBarPositionTopAttachedを使用するか、ビューの境界とフレームを使用することができます。 Appleのドキュメント およびbla bla blaですが、問題を解決するにはしばらく時間がかかります。
この問題を解決するための最良かつ最も簡単な方法は、View ControllerをNavigation Controller内に埋め込むことです。それには、View Controllerを選択して、[エディタ]> [埋め込み]> [Navigation Controller]を選択します。 (古いNavigation Barにコンテンツがある場合、まずコンテンツを下にドラッグし、View ControllerをNavigation Controllerに埋め込み、次に新しいNavigation Barのバーボタンを移動してから古いNavigation Barを削除します)
2番目の問題の解決策:この解決策は、アップデートで言及した特定の質問に対するものであり、これを読んでいる一般の人々に対するものではありません。ご覧のとおり、Navigation and Status Barは表示されず、透明な領域に親View Controllerが表示されています。この問題に直面している理由を実際に使用していませんが、おそらくECSlidingViewなどのサードパーティライブラリが関係しているためです。ストーリーボードでこのView Controllerを選択し、ビューの背景色をナビゲーションバーと同じに設定できます。これにより、背後の親View Controllerの表示が停止し、ナビゲーションバーとステータスバーの表示が開始されます。これで、View Controllerの残りの部分をテキストビューでカバーすることができます。
お役に立てれば!
IOS 7以降、ステータスバーはView Controllerのビュー全体に重なっているため、ナビゲーションバーはステータスバーに近すぎます。ナビゲーションバーは(0、0)にあるため、ステータスバーはナビゲーションバーの上に表示されます。これを解決するには、ナビゲーションバーを下に移動するだけで(または、他の人が言ったように)、ナビゲーションバーとtopLayoutGuideの間に制約を作成します。
これを行うと、ナビゲーションバーと画面上部の間に20ポイントのギャップがあることがわかります。これは、ナビゲーションバーを20ポイント下に移動したためです。 「しかし、UINavigationController
はそれを正しく行うことができます!」もちろん、View ControllerにUIBarPositioningDelegate
を実装することで実現しています。これは、次のように実装する必要がある1メソッドのプロトコルです。
- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar {
return UIBarPositionTopAttached;
}
View ControllerをNavigation Barのデリゲートとして追加した後、Navigation Barはまだ20ポイント下に移動していますが、その背景はUINavigationController
のようにステータスバーの下に広がります。
あなたが見ているもう一つのことは、ナビゲーションバーが半透明であるということです。つまり、ナビゲーションバーの下にあるものはある程度見えます。 translucent
のUINavigationBar
プロパティは、iOS 7ではデフォルトでYES
に設定されます。iOS7より前は、デフォルトはNO
でした。
あなたはこれを簡単に行うことができます:
1)ナビゲーションバーとトップレイアウトガイドの間に制約を追加します(navigationBarを選択し、ctrlキーを押しながら、ボトムレイアウトガイドに移動し、ctrlキーを押したままにします)
2)select 垂直間隔:
3)定数をに設定します:
結果:
[〜#〜] update [〜#〜]
AppDelegateファイルで、これを追加できます。
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
{
// Prevent Navigationbar to cover the view
UINavigationBar.appearance().translucent = false
}
あなたのviewDidLoadメソッドであなたが試すことをお勧めします:
self.navigationController.navigationBar.translucent = NO;
(デフォルトでは現在はyesです)
UIViewController
がUINavigationController
になく、UIStoryBoard
を使用している場合、デルタYの「iOS 6/7 Deltas」を20に設定できます。 UIStatusBar
からオフセットする必要があるサブビュー。
Swiftを使用:
@Scott Berrevoetsが答えで言ったように、プロトコルpositionForBar
でメソッドUIBarPositioningDelegate
を実装する必要がありますが、UINavigationBarDelegate
プロトコルはこのプロトコルを実装します:
public protocol UINavigationBarDelegate : UIBarPositioningDelegate {
...
}
Storyboardを使用して設定したdelegate
のUINavigationBar
を設定し、メソッドを実装するだけで、次のように完了します。
class ViewController: UIViewController, UINavigationBarDelegate {
@IBOutlet weak var navigationBar: UINavigationBar!
override func viewDidLoad() {
super.viewDidLoad()
self.navigationBar.delegate = self
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func positionForBar(bar: UIBarPositioning) -> UIBarPosition {
return UIBarPosition.TopAttached
}
}
注:ナビゲーションバーのy軸の位置を設定した場合、40上から20に設定する必要があるUINavigationController
の動作をシミュレートするために、上から下にこの位置から上に伸びます。
それがあなたのお役に立てば幸いです。
これは私にとってはうまくいきます。あなたも同じ幸運を持っていることを望みます:)。
ビューに以下のコードを追加します。
-(void) viewDidLayoutSubviews
{
CGRect tmpFram = self.navigationController.navigationBar.frame;
tmpFram.Origin.y += 20;
self.navigationController.navigationBar.frame = tmpFram;
}
基本的にナビゲーションバーの場所を変更します。
それでも誰かに役立つ場合、これは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;
}
}
IOS 6.1以前のデバイスでは、ナビゲーションバーは以前と変わりません。
これは、ステータスバーの内容を軽くするために使用したものです。
-(UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleLightContent;
}
まず、Info.plistでUIViewControllerBasedStatusBarAppearance
をNOに設定します。次に、AppDelegate
のapplication:didFinishLaunchingWithOptions:
メソッドの追加:
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
[application setStatusBarStyle:UIStatusBarStyleLightContent];
self.window.clipsToBounds = YES;
self.window.frame = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height-20);
self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);
}
return YES;
これはIOS7の新機能です。 IOS7の20ピクセルのナビゲーションバーを0ピクセルで見つめる代わりに。ソリューションとして、ビュー全体を下に20ピクセルにシフトするか、高さ64ピクセルのナビゲーションバーに画像を使用できます。
以前のiOSウィンドウではステータスバーの後、iOS 7では0pxから開始します。以前のバージョンでは、ビューの高さは460(iPhone 4s以前)および548(iPhone 5)ですが、iOS 7ではビューの高さは480(iPhone 4s以前)および568 (iPhone 5以降)したがって、2ピクセル以降でビューの配置を開始するか、20ピクセルからビューを開始する必要があります。
rootviewcontrollerまたは20pxからのビューを設定するためのすべてのviewcontrollerで以下のコードを書くことができます
#define IOS7_HEIGHT 64
- (void)viewDidLayoutSubviews {
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
if ([currSysVer compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending)
{
CGRect frame=[self.view frame];
if (frame.Origin.y!=IOS7_HEIGHT) {
frame.Origin.y = IOS7_HEIGHT;
frame.size.height -= IOS7_HEIGHT;
[self.view setFrame:frame];
[self.view layoutSubviews];
}
}
}
ステータスバーが20、ナビゲーションバーが44なので、ここでの高さは64です。以下のコードを試してください。あなたの問題は解決されます。
@Masterfegoのソリューションの実装に問題がある人(これも公式ですが、Xcode 6.3と自動制約に問題があります)のために、これは私がやったことです:
ナビゲーションバーが追加されたUIViewControllerがあります。 NAvigationバーを選択し、64pxの高さ制限を追加しました。後でnavbarが高くなるという警告が表示されます(しかし、これは私たちが行うことです)。最後に、ステータスバーが素敵に見え、ナビゲーションバーと同じ色になっていることがわかります。 :)
PS:まだ画像を投稿できません。
IOS 7では、アプリは画面サイズの100%を占めます。これは問題ではありません。 http://www.doubleencore.com/2013/09/developers-guide-to-the-ios-7-status-bar/
おそらく、トップレイアウトガイドに添付される制約を作成して、ステータスバーに対するナビゲーションバーの位置を指定できます。レイアウトガイドの使用の詳細については、「 iOS 7 UI移行ガイド:外観と動作」セクション を参照してください。
それが最良の答えです。しかし、私はStoryboard
の使用方法を知り、それにUINavigationBar
をドラッグしたかった。デリゲートメソッドを実装し、戻り結果をUIBarPositionTopAttached
に設定すると、機能しませんでした。
- (void)viewDidLoad{
self.navigationbar.delegate = self;
}
- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar{
NSLog(@"Got it");
//
// CGRect frame = self.navigaitonBar.frame;
//
// frame = CGRectMake(0, 20, CGRectGetWidth(frame), CGRectGetHeight(frame));
// self.navigaitonBar.frame = frame;
//
// NSLog(@"frame %f",frame.Origin.y);
return UIBarPositionTopAttached;
}
Xcode 6とSwiftを使用している場合は、次のようにすることができます。
ユーザーがModalViewController
からMainViewController
に戻ったときに、NavigationBar
、MainViewController
の位置からフルスクリーンModalViewController
を開くと、問題に直面していました。
ユーザーがMainViewController
に戻ったときに、ステータスバーの高さが含まれていなかったことに気付きました。 NavigationBar
に戻る前後に、ViewController
の発生元をデバッグして確認してください。
// This method will adjust navigation bar and view content.
private func adjustNavigationControllerIfNeeded() {
var frame = self.view.frame
let navigationBarHeight = self.navigationController!.navigationBar.frame.size.height
if(frame.Origin.y == navigationBarHeight && !UIApplication.shared.isStatusBarHidden) {
// If status bar height is not included but it is showing then we have to adjust
our Navigation controller properly
print("Adjusting navigation controller")
let statusBarHeight = UIApplication.shared.statusBarFrame.height
frame.Origin.y += statusBarHeight // Start view below navigation bar
frame.size.height -= statusBarHeight
self.view.frame = frame
self.navigationController!.navigationBar.frame.Origin.y = statusBarHeight // Move navigation bar
}
}
そして、viewWillAppearメソッドから呼び出します-
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.adjustNavigationControllerIfNeeded()
}