114
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(y = statubar height + nav bar height)値を追加して処理する必要がありiOS 7ますか?

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

viewDidLayoutSubviews で、ビューの境界を出力します。

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

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

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

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

アップデート:

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

self.navigationController.navigationBar.translucent = NO;

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

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

4

9 に答える 9

189

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

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

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

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

于 2013-08-07T12:44:18.220 に答える
12

OPが言うように、ナビゲーションバーを不透明に設定するという簡単な解決策があります。コードでこれを行うのではなく、ルート ナビゲーション バーの「半透明」のチェックを外すだけです。

ここに画像の説明を入力

于 2013-10-30T17:05:11.903 に答える
8

self.edgesForExtendedLayout=UIRectEdgeNone;

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

于 2013-08-14T12:25:54.797 に答える
2

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

ここに画像の説明を入力

于 2013-10-04T16:54:27.627 に答える
1

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

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

 #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
     if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;
 #endif
于 2014-01-29T10:18:05.287 に答える
0

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

CGFloat topLayoutGuide = self.topLayoutGuide.length + self.tabBarController.navigationController.navigationBar.frame.size.height;
self.tableView.contentInset = UIEdgeInsetsMake(topLayoutGuide, 0, 0, 0);
于 2013-10-30T00:19:37.313 に答える