web-dev-qa-db-ja.com

新しいiOS7 SDKを使用すると、ビューの上にナビゲーションバーが表示されます

CGRect cgRect1 = [[UIScreen mainScreen] applicationFrame];


UISearchBar  *mySearchBar = [[UISearchBar alloc] 
               initWithFrame:CGRectMake(0, 0, cgRect.size.width, 40)];

mySearchBar.autoresizingMask = 
              UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight ;


UITableView  *myTableView = [[UITableView alloc] 
     initWithFrame:CGRectMake(0, 40, cgRect.size.width, cgRect.size.height-40)];

myTableView.autoresizingMask = 
               UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;


[self.view addSubview:mySearchBar];
[self.view addSubview:myTableView];

以前のバージョンでは、正常に機能しています。検索バーは、statusbarおよびナビゲーションバーの下に表示されます。 tableviewは検索バーの下に表示されます

しかし、これをXcode 5 sdk iOS 7で実行すると、検索バーは表示されず(ステータスバーとナビゲーションバーの下に配置されると思います)、ナビゲーションバーもテーブルビューの上に表示されます。

iOS 7安定版リリースで修正されますか?

それとも私のコーディングの問題ですか?

または、(y = statubar height + nav bar height)にy iOS 7値を追加して処理する必要がありますか?

最近、iOS 7でアプリをテストするためにXcode 5 DPをダウンロードしました。最初に気付いて確認したことは、ステータスバーとナビゲーションバーを考慮して、ビューの境界が常にサイズ変更されないことです。

ViewDidLayoutSubviewsでは、ビューの境界を印刷します。

{{0, 0}, {320, 568}}

これにより、コンテンツがナビゲーションバーとステータスバーの下に表示されます。

メイン画面の高さを取得し、ステータスバーの高さとナビゲーションバーの高さを差し引くことで、自分で高さを説明できることは知っていますが、それは不必要な余分な作業のようです。

他の誰かがこの問題を経験しましたか?

更新:

この特定の問題の解決策を見つけました。ナビゲーションバーの半透明プロパティをNOに設定します。

self.navigationController.navigationBar.translucent = NO;

これにより、ビューがナビゲーションバーとステータスバーの下に表示されなくなります。

ただし、ナビゲーションバーを半透明にする場合の修正は見つかりませんでした。たとえば、写真を全画面表示して、ナビゲーションバーを半透明にし、その下にフレームを配置したいです。それは機能しますが、ナビゲーションバーの表示/非表示を切り替えると、さらに奇妙な結果を経験しました。最初のサブビュー(UIScrollView)はその境界を取得しますy原点は毎回変更されます。

112
user2110287

それは完全に真実ではありません。 iOS 7には、以前のバージョンのiOSと同様にレイアウトの動作を調整できる新しいプロパティが導入されています。このコードをView Controllerに配置すれば、準備完了です!ナビゲーションバーが占めるスペースは自動的に考慮される必要があります

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;

-(void)viewDidLoadメソッドに上記を追加する必要があります。

注:APIはベータ版から変更されているため、iOS 7およびXcode 5の最新のGMリリースを使用する必要があります。

188
One Man Crew

Screenshot from storyboard

ストーリーボードで作業している場合(これを強くお勧めします!)これが解決策です。ストーリーボードでViewControllerの「エッジを拡張」を無効にできます。 viewControllerごとにこれを行う必要があります。拡張エッジを無効にするには、StortyboardのviewControllerアイコンをクリックし(ビュー自体の下のproductOwner以外)、属性インスペクターを選択します(画像のように)。

これにより、iOS 6のような位置合わせ線も設定されます。

XCode 5のもう1つの優れたツールは「プレビュー」です。バトラーボタン(アシスタントエディター)をクリックし、プレビューを選択します。そこでiOS 6を選択し、iOS 6でストーリーボードデザインがどのように見えるかを確認できます。

そのちょうど素晴らしい:D

[更新]

注意:「エッジを拡張」を無効にすると、iOS7でアプリがバックグラウンドに入るときにナビゲーションバーが黒く光ることがあります。グローはマルチタスクビューにも表示されます(ホームボタンを2回押します)。これは、ナビゲーションのバービューの背景色を白に設定することで解決できます。

[self.navigationController.view setBackgroundColor:[UIColor whiteColor]];
37
MQoder

OPが言うように、ナビゲーションバーを不透明に設定することで、これに対する簡単な解決策があります。コードでこれを行うのではなく、ルートナビゲーションバーの[半透明]をオフにします。

enter image description here

12
Bids

self.edgesForExtendedLayout=UIRectEdgeNone;

IOS 7シミュレーターで動作します(Xcode 5 DP5)

8
yhlin

これらの回答はすべて、特にMQoderの場合に役立ちましたが、私にとってはデフォルトのトップバーを「不透明な黒ナビゲーション」に設定する必要がありました。

enter image description here

2
jasonpurdy

@One Man Crewの答えは正しいですが、

古いバージョンでアプリを実行する際のエラーを回避するために、このコードを使用することをお勧めします。

 #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
     if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;
 #endif
1
Yossi

ユーザーがテーブルビューをスクロールしたときに透明度を維持する場合は、そのcontentInsetを設定できます。

CGFloat topLayoutGuide = self.topLayoutGuide.length + self.tabBarController.navigationController.navigationBar.frame.size.height;
self.tableView.contentInset = UIEdgeInsetsMake(topLayoutGuide, 0, 0, 0);
0
Enrico Susatyo

self.edgesForExtendedLayout = UIRectEdgeNone;

AppDelegate#application:didFinishLaunchingWithOptionsでこれを行う必要があります。

self.window.backgroundColor = [UIColor whiteColor];

そうしないと、ナビゲーションバーの背景色が灰色に変わります。透明なナビゲーションバーがウィンドウに重なるためです。

0
EIMEI