web-dev-qa-db-ja.com

iOS7 UITableViewControllerを上部のステータスバーの下に表示しないようにするにはどうすればよいですか?

私のルートコントローラーはTabBarController(タブ付きアプリケーション)です。タブの1つはUITableViewControllerです。それに切り替えてアイテムをスクロールすると、上部のステータスバー(信号、バッテリーなど)の下に表示されます。私はそれを望んでいません。私はそれを不透明にするか...何かしたいです。ステータスのものの下にあるテーブルセルのテキストが視覚的に不快です。

理解できないいくつかの属性設定を使用して、ストーリーボードからこれを修正できますか?または、サブクラスにいくつかのメソッドを追加する必要がありますか?または、UITableViewControllerを他の種類のコントローラーでラップする必要がありますか?

Storyboardの属性ページで、ViewControllerレイアウトとエッジの拡張設定のさまざまなバリエーションを試しましたが、どれもそれを改善するようには見えません。

Update:私の問題は iOS 7:ステータスバーの下にUITableViewが表示される と非常に似ていると思います。唯一の違いは、私がTabBarControllerに埋め込まれていることです。その場合はルートビューです。 NavigationControllerに埋め込み、Show Navigation BarFalseに変更しましたが、違いはありませんでした。

スクリーンショット

2つの子、1つの単一ビュー、およびもう1つがテーブルビューであるタブ付きコントローラーを示すストーリーボード(縮小)。

Storyboard

Tab Bar Controllerの設定

tab bar controller settings

Table View Controllerの設定

table view controller settings

電話でアプリがどのように見えるか

enter image description here

ストーリーの終わり方

以下の多くの回答にもかかわらず、実際に機能するものはありませんでした。少しだけですが、そうではありません。 Embeded in NavigationControllerアプローチも試しましたが、これにも問題がありました。しかし、うまくいったのはこれでした:

  1. UIViewControllerを追加
  2. 子コントローラーとそれとTab Bar Controllerの関係を設定します(他の2つと同様)。
  3. コントローラーではなくTableViewを新しいUIViewControllerに追加し、必要に応じて配置すると、ステータスバーの下部にスナップします
  4. TableViewのdelegateおよびtableSourceを新しいコントローラーとして設定します
  5. カスタムUIViewControllerサブクラスを作成し、ストーリーボードのコントローラーのクラスタイプを更新します
  6. カスタムUITableViewControllerサブクラスから新しいサブクラスにテーブル関連メソッドをコピーします
  7. オリジナルからプロトタイプテーブルセルを選択し、コマンド+ドラッグして新しいテーブルビューにドラッグします。
  8. 幸いにもdelete元のTableViewController(およびラッパーNavigationController)も削除します
  9. 前のものと一致するようにタブバー項目を更新する
  10. 「ハードにしようとしている」ために別のものをチョックする
33
Travis Griggs

誰かがストーリーの終了方法を(現在の長い)質問の終わりに見逃した場合、短い答えは:se a指定された目標を達成したい場合は、TableViewControllerではなく、TableViewを指定したシンプルなUIViewController。

2
Travis Griggs

ViewDidLoadでこれを試してください:

self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0);

20 pxはステータスバーの高さです。ナビゲーションバーがある場合は、20ではなく64を使用します

33

誰かがまだこのスレッドを読んでいる場合:

私のために働いたのは、親のTab Bar Controllerの「Edges」オプションのチェックを外すことでもありました。これにより、iOS6およびiOS7で一貫した動作が提供されます。

15
Florian

SWRevealControllerを使用すると、同じ問題が発生していました。

上のコメントと下のコメントを使用して、これを

-(void)viewWillAppear instead of ViewDidLoad
     self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0);
5
user3696154

次のようなものをView ControllerのviewWillAppearメソッドに追加しようとしましたか?

 if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])
 {
    self.edgesForExtendedLayout = UIRectEdgeNone;
 }
4
Robert

ストーリーボードを使用してこれを解決することもできます。

プロジェクトアウトライン(エディターの左側)からテーブルビューを選択し、[プロパティ](右側)> [サイズインスペクター]タブ> [スクロールビュー]> [コンテンツインセット]> [トップ]に移動します。

2
Elsa

次をviewWillAppearに追加しました

self.tableView.contentInset = UIEdgeInsetsMake(22, 0, 0, 0);
2
Brian Broom

NavBarをnonTranslucentにしたいだけのように見えます。

[self.navigationController.navigationBar setTranslucent:NO];
1
hv88

私は同じ問題に遭遇し、私のために働いた解決策はセクションヘッダービューを追加することでした:

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

次に、ヘッダーのテキストのOrigin.yに20を追加しました。

次に、元の高さに20を追加してヘッダーの高さを変更しました

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return myHeight+20;
}
1
RYUX123

IOS 8.4の時点では、他の回答にリストされているさまざまなストーリーボードオプションを使用しても何も得られませんでした。

私は、タブコントローラーに通常のビューを配置し、それを "コンテナービュー"で埋めることで、次元定数に頼らずにこれを回避し、次に "埋め込み"セグエでUITableViewControllerに接続しました。

テーブルは、ナビゲーションバーと下部のタブバーの両方を尊重するようになりました。

1
bitmusher

テーブルの@IBOutletが

 @IBOutlet var tableView: UITableView!

関数prepareTable()を作成します。そのメソッドに以下の行を追加します

tableView.contentInset.top = UIApplication.shared.statusBarFrame.height

viewDidLoad()からこのメソッドを呼び出します

1
Dilip Jangid

私にとって簡単な解決策はありました(コードはC#であり、それは無効だと思われるためです)...

  1. UITableViewControllerコンストラクターで新しいUIViewを作成します(TableViewと同じディメンションを設定します)。

  2. TableViewを新しく作成したビューに追加します。

  3. 新しく作成したビューをUITableViewControllerのビュープロパティに設定...

UITableViewControllerのコンストラクターで

var view = new UIView ();
view.Frame = this.TableView.Frame;
view.AddSubview (this.TableView);

this.View = view;
1
Ricardo LR

アウトラインビュー、またはストーリーボードが、現在テーブルビューコントローラーを備えているTab Bar Controllerであるとします。アプリを実行すると、テーブルビューのセルは、透明な背景があるように見えるステータスバーの下で実行されます。これはダメだ!

StackOverflowで見つけることができるものを何でも試して何時間も費やした場合は、おそらく新しいキャリアを検討する時間であり、1-800-LUV-TRUKまたは1-800-SHT-KIKRをダイヤルする準備をしているように感じました背中を軽くたたいて、このような時にあなたが飲むエリクサーを開いてください。それはあなたのせいではないからです。本当に。 Travisは、viewDidLoad、viewWillAppear、viewDidAppear、またはIBでのボタンの選択/選択解除のコードがこの状況で役立たないことは絶対に正しいです。

上記のTravisのソリューションは確かに機能しますが、それは少し長く、コードのコピーと貼り付けがあり、バグバニーのエピソードが私にとってはフルレングスの映画のように感じるほど短い注意期間があります。複雑なものはすべて台無しにします。しかし、ちょっと、あなたの走行距離は、おそらくそうではないかもしれませんが、変わるでしょう。とにかく...

IOS 9を実行しているアプリのXcode 7.3(私は7と8を想定していますが、これについては確かに知らず、現在チェックするのが面倒です)には、コードを記述する必要がない簡単な方法があります。そして、それはすべてXcodeのInterface Builder内で行われます。

注意:用語のいずれかが正確でない場合はごめんなさい。間違っていた場所を教えてください。間違ったラベルを修正します。))

  1. Interface Builderの「ユーティリティ」領域に移動し、ライブラリペインからオブジェクトライブラリを選択します。

  2. Navigation View Controllerオブジェクトを選択して、ストーリーボードのシーンにドラッグします。ドラッグ中に2つのシーンアイテムが表示されます。これらは、Navigation ControllerシーンとTable View Controllerシーンです。

  3. Navigation Controllerシーンに付随する重複したTable View Controllerシーンを削除します。

  4. Tab Bar ControllerとTable View Controller間のリレーションシップ接続を選択し、「削除」を押します。

  5. ストーリーボードで、Navigation ControllerとTable View Controllerを希望する方法で再配置します。

  6. Tab Bar ControllerシーンからNavigation ControllerシーンにControlキーを押しながらドラッグし、「Relationship Segue、view controller」を選択します。

  7. Navigation ControllerシーンからTable View ControllerシーンにControlキーを押しながらドラッグし、「Relationship Segue、root View Controller」を選択します。

  8. 最後に、ユーティリティのオブジェクトライブラリで、ナビゲーションアイテムオブジェクトをテーブルビューコントローラーシーンのテーブルビューにドラッグします。

これで、アプリを実行すると、ナビゲーションバーが表示され、テーブルビューのセルが透明なステータスバーの下に表示されなくなります。

お役に立てれば。

0
Jim Hillhouse