iOS 7:UITableViewがステータスバーの下に表示される


219

私のアプリケーションの最初の画面は、UITableViewControllerナビゲーションバーがない状態です。つまり、コンテンツがステータスバーの下に流れているため、テキストの衝突が多数発生しています。私はのための特性の両方を調整してきたUnder top barsし、Adjust scroll view insetsこれは実際に下にスクロールするのを止めるが、下のテーブルビューのトップを維持するコストでください。UITableViewフレームを20ピクセルずつオフセットするように設定しようとしましたが、効果がないようで、現在アプリにiOS 6との互換性が必要なため、iOS 7ストーリーボードにジャンプして自動レイアウトを強制的に使用できませんトップの高さガイド。誰かが両方のバージョンで機能する解決策を見つけましたか?

私が試したもの:edgesForExtendedLayout、、Under top barsおよびのストーリーボード内の設定の変更Adjust scroll view、フレームの新しい領域への強制。

写真は千の言葉に値します: ステータスバーの流れ


2
迅速な回避策は、iOS 7上で動作しているときに、テーブルに空白の20ピクセルのヘッダを追加するかもしれない
EricS

@EricS:私はすでにUITableViewそこにヘッダーを持っています、それはステータスバーの下にも流れます。
Nicholas Smith

iOS 6で自動レイアウトガイドを使用しないのはなぜですか?できます。
スティーブンフィッシャー

回答:


366

これを複製したい人は、次の手順に従ってください。

  1. 新しいiOSプロジェクトを作成する
  2. メインストーリーボードを開き、デフォルト/初期を削除します UIViewController
  3. UITableViewControllerオブジェクトライブラリから新規をドラッグします
  4. それを初期ビューコントローラーとして設定します
  5. テーブルにテストデータをフィードする

上記の手順に従うと、アプリを実行しても、Xcodeのチェックボックスを「{Top、Bottom、Opaque} Barsの下のEdgeを拡張する」に調整するなど、何も表示されず、ステータスバーの下に最初の行が表示されなくなります。プログラムでこれに対処することもできません。

たとえば、上記のシナリオでは、以下は効果がありません。

// These do not work
self.edgesForExtendedLayout=UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars=NO;
self.automaticallyAdjustsScrollViewInsets=NO;

この問題は非常に苛立たしいものになる可能性があり、特にUITableViewControllerオブジェクトライブラリから事前に配線された独自の問題として表示されるため、これはApple側のバグだと思います。

「マジックナンバー」の任意の形式を使用してこれを解決しようとしているすべての人、たとえば「20pxのデルタを使用する」には同意しません。この種の密結合プログラミングは、Appleがここで求めていることとはまったく異なります。

この問題に対する2つの解決策を発見しました。

  • 保存UITableViewControllerのシーンを
    あなたは維持したい場合はUITableViewController、手動で別のビューにそれを配置することなく、ストーリーボードでは、あなたは埋め込むことができますUITableViewControllerUINavigationControllerインスペクタ(編集>埋め込みコードで>ナビゲーションコントローラ)のチェックを外し、 『ショーナビゲーションバー』 。これにより、追加の微調整を必要とせずに問題が解決さUITableViewControllerれ、ストーリーボード内ののシーンも保持されます。

  • AutoLayoutを使用してUITableViewを別のビューに埋め込む (私はこれがAppleがこれを実行する方法だと信じています)
    UIViewControllerを作成し、その中にドラッグしますUITableView。次に、Ctrlキーを押しUITableViewながらステータスバーに向かってドラッグします。マウスがステータスバーの下部に移動すると、「上部レイアウトガイド」と書かれた自動レイアウトバブルが表示されます。マウスを離し、「垂直間隔」を選択します。これにより、レイアウトシステムにステータスバーの真下に配置するよう指示します。

空のアプリケーションで両方の方法をテストしましたが、どちらも機能します。プロジェクトで機能させるために、追加の微調整が必​​要になる場合があります。


5
参考までに、オプション1(ナビゲーションコントローラに埋め込む)を使用すると、テーブルをスクロールしたときに、セルが半透明のステータスバーの後ろに表示されます。
RyanR 2013

4
@RyanR私もそれに気づいたが、いつかは大丈夫だと思う。AppleはモバイルSafariの開いているタブビューで同じことを行いました。タブはステータスバーの下に表示されます。ナビゲーションコントローラーソリューションが最も簡単な回避策です。ただし、半透明のステータスバーは愚かな考えです。
プライドチョン

6
テーブルビューから上方向にコントロールドラッグすると、ステータスバーに出くわしません。ビューにステータスバーが表示されない、ここで何を意味するのかわからない...
Jesse

4
オプション2 はXcode 5 では機能なくなりました。記述されたアクション(ctrl-ドラッグ)はアウトレットシステムによって所有されているため、機能するはずがありませんが、左側のシーンツリーに手動でドラッグしても、トップレイアウトガイドは機能しません(そうすべきです、AFAICT-これはAutoLayoutのもう1つの大きなバグだと思います:( :()
Adam

3
@PrideChungテーブルビューでヘッダーを使用すると愚かに見え、ヘッダーは上部に固定されたままになり、要素は背後に表示されなくなり、透明なステータスバーの後ろに再び表示されます...
Ixx

86

プログラムで物事を行ってUITableViewControllerおりUINavigationController、最善策なしでを使用している場合は、で以下を実行しますviewDidLoad

スウィフト3

self.tableView.contentInset = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0)

以前のスウィフト

self.tableView.contentInset = UIEdgeInsetsMake(20.0f, 0.0f, 0.0f, 0.0f);

UITableViewControllerまだステータスバーの後ろにスクロールしますが、一番上にスクロールしたときに、その下ではありません。


1
OSバージョン> 7のチェックを追加し、古いOSをサポートすることもできます(それらの差し込みはありません)。それ以外の場合、これは私の目的にはうまくいきました。
SimpsOff 2014年

8
高さの値をハードコーディングするのは最善の方法ではありません。
MaciejKozieł2014

3
はい、topLayoutGuide代わりに長さを使用します。
リプカ2014年

10
私が使用したいUIApplication.sharedApplication.statusBarFrame.size.height20の代わりに
mojuba

これは最近、UIApplication.shared.statusBarFrame.size.heightに更新されました。
asetniop 2017年

23

注意:これは私にとって次の構成で機能しました:

  • 画面上部にナビゲーションバーはありません(テーブルビューとステータスバーが一致)
  • テーブルビューはスクロール不可

上記の2つの要件が満たされていない場合は、距離が異なる場合があります。

元の投稿

私はビューをプログラムで作成しましたが、これは私にとってはうまくいきました:

- (void) viewDidLayoutSubviews {
    // only works for iOS 7+
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;

        // snaps the view under the status bar (iOS 6 style)
        viewBounds.origin.y = topBarOffset * -1;

        // shrink the bounds of your view to compensate for the offset
        viewBounds.size.height = viewBounds.size.height + (topBarOffset * -1);
        self.view.bounds = viewBounds;
    }
}

ソース(中topLayoutGuideの pg.39の下部にある部分)。


興味深い...私のプロジェクトではこのように問題なく呼び出すことができました...しかし、あなたよりもビューレイアウト構造が単純な場合があります。あなたの提案は正しいです、私は私の答えでその変更を行います。
Stunner 2013

アプリをローテーションすると、たまたま問題が発生しました。ローテーションを無効にしていた場合は、おそらく問題はありません。
ジェレミー

プロジェクトでローテーションを有効にしていないので問題に遭遇しましたが、そうです、それでも良い点はあります。
Stunner 2013

1
独自のコンテナコントローラを実装する場合、これはステータスまたはナビゲーションバーのアンダーラップを調整する正しい方法です。
Rafael Nobre 2013年

ビューの境界の高さではなく、原点を変更した場合、原点を変更した量だけ画面の下端で下部が切り取られませんか?(そのため、最後の数行のピクセルが見えなくなります)
Tenfour04

20

上の答えに追加:

2番目の方法が最初はうまくいかなかった後、私は追加のいじくり回しを行い、解決策を見つけました。

TLDR; 上の答えの2番目の解決策はほぼ機能しますが、xCodeの一部のバージョンでは、Ctrlキーを押しながら「トップレイアウトガイド」にドラッグして、垂直間隔を選択しても何も起こりません。ただし、最初にテーブルビューのサイズを調整してから、[トップスペースからトップレイアウトガイド]を選択すると機能します。


  1. 空のViewControllerをストーリーボードにドラッグします。 ビューコントローラー

  2. UITableView オブジェクトをビューにドラッグします。(UITableViewControllerではありません)。青いレイアウトガイドを使用して、中央に配置します。

テーブルビュー 中央の画像

  1. UITableViewCellをTableViewにドラッグします。これはプロトタイプ再利用セルになるので、[属性]タブの[再利用識別子]を設定することを忘れないでください。そうしないと、クラッシュします。

テーブルビューセルを追加 識別子を再利用

  1. UIViewControllerのカスタムサブクラスを作成し、<UITableViewDataSource, UITableViewDelegate>プロトコルを追加します。Identity Inspectorで、ストーリーボードのViewControllerをこのクラスに設定することを忘れないでください。

  2. 実装ファイルにTableViewのアウトレットを作成し、「tableView」という名前を付けます

アウトレットを作成 tableView

  1. TableViewを右クリックし、dataSourceとデリゲートの両方をViewControllerにドラッグします。

dataSourceデリゲート

ステータスバーに表示されない部分について説明します。

  1. テーブルビューの上端をつかんで、上部にある青い破線の自動レイアウトガイドの1つまで下に移動します。

サイズ変更

  1. これで、テーブルビューから上部へのドラッグを制御し、[上部スペースから上部へのレイアウトガイド]を選択できます。

上のスペースから上のレイアウトガイド

  1. TableViewのあいまいなレイアウトに関するエラーが表示されます。不足している制約を追加して完了します。

不足している制約を追加

これで、通常のようにテーブルビューを設定できます。ステータスバーはクリップされません。


11
- (void) viewDidLayoutSubviews {
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
        self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
        if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
            self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;
        viewBounds.origin.y = topBarOffset * -1;
        self.view.bounds = viewBounds;
        self.navigationController.navigationBar.translucent = NO;
    }
}

https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/SupportingEarlieriOS.html#//apple_ref/doc/uid/TP40013174-CH14-SW1


2
<=を>に切り替え、空のifブロックを削除する
pfrank

1
self.topLayoutGuide.lengthからの読み込みはviewDidLayoutSubviews、子ビューのレイアウトを台無しにします。

あなたが説明するようにそうしている間@OLzhは、self.tableViewはスクロールできません。
DawnSong、2015年

8

ストーリーボードでUIViewControllerを選択し、[トップバーの下のエッジを拡張]オプションをオフにします。私のために働いた。:)


残念ながら、うまくいきませんでした。完全にデフォルトのUITableViewControllerは、ステータスバーと重複しています。ステータスバーはトップバーとは見なされません。ナビゲーションバーとタブバーだけです。
Andrew Duncan

私に役立つ唯一の解決策は、tyです。(IBのステータスバーの下にあるテーブルビューを "短く"して、制約を更新する必要があることに注意してください)。
Martin Makarsky、2015年

XTable 8でUITableViewControllerを使用して動作しました。
エドゥアールバルビエ2017

8

これは、 "Swift"での記述方法です。@ lipkaの回答に対する調整:

tableView.contentInset = UIEdgeInsetsMake(20.0, 0.0, 0.0, 0.0)

ここで迅速に許可されていませんか?
uplearnedu.com 2015年

私のために働いた唯一の解決策、それは私にUIVIewControllerを作成させません
Shereef Marzouk

1
それもios8には、デフォルトのステータスバーが存在しない風景の中に、20でトップのインセットを保持しますので、これはあまり理想的である
voidref

:この変化は、私のためだけでなく任意の構成を扱う- (void)viewDidLayoutSubviews { if (self.tableView.contentInset.top != self.topLayoutGuide.length) { self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0); } }
QIX

5

Xcode 7の場合、ナビゲーションバーの「半透明」チェックマークを外すとうまくいきました。

ここに画像の説明を入力してください


最も単純で、最も速く、最も簡単で、最も安全ですか?解決。これが他のすべてに比べて賛成票が少ない理由がわかりません。
Gruntcakes

3

これにより、UITableViewControllerの問題が修正されます(マジックナンバーなし)。私が修正することができなかった唯一のことは、あなたが電話をかけている場合です、その場合、tableViewの上部が押し下げられすぎています。誰かがそれを解決する方法を知っているなら、私たちに知らせてください。

class MyTableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()    
        configureTableViewTop()
    }

    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
        coordinator.animateAlongsideTransition({ (context) -> Void in
            }, completion: { (context) -> Void in
                self.configureTableViewTop()
        })
    }

    func configureTableViewTop() { 
        tableView.contentInset.top = UIApplication.sharedApplication().statusBarFrame.height
    }
}

2

どのようにコーシャになるかはわかりませんが、このスキームではViewControllerのビューが下に移動し、ステータスバーに無地の背景が表示されることがわかりました。

- (void)viewDidLoad {
    [super viewDidLoad];

    // Shove everything down if iOS 7 or later
    float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (systemVersion >= 7.0f) {

        // Move the view down 20 pixels
        CGRect bounds = self.view.bounds;
        bounds.origin.y -= 20.0;
        [self.view setBounds:bounds];

        // Create a solid color background for the status bar
        CGRect statusFrame = CGRectMake(0.0, -20.0, bounds.size.width, 20);
        UIView* statusBar = [[UIView alloc] initWithFrame:statusFrame];
        statusBar.backgroundColor = [UIColor redColor];
        [self.view addSubview:statusBar];
    }

もちろん、redColor背景に好きな色に置き換えてください。

ステータスバーの文字/シンボルの色を設定するには、スウィズルの1つを個別に実行する必要があります。私はplistで、これをグローバルに行うために使用View controller-based status bar appearance = NOStatus bar style = Opaque black styleています。

動作しているようですが、バグや問題について聞いてみたいと思います。


2

chappjcの回答は、XIBを操作するときに非常に役立ちます。

TableViewControllersをプログラムで作成するときに最もクリーンなソリューションを見つけたのは、UITableViewControllerインスタンスを別のUIViewControllerでラップし、それに応じて制約を設定することです。

ここにあります:

UIViewController *containerLeftViewController = [[UIViewController alloc] init];
UITableViewController *tableViewController = [[UITableViewController alloc] init];

containerLeftViewController.view.backgroundColor = [UIColor redColor];

hostsAndMoreTableViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
[containerLeftViewController.view addSubview:tableViewController.view];

[containerLeftViewController addChildViewController:tableViewController];
[tableViewController didMoveToParentViewController:containerLeftViewController];

NSDictionary * viewsDict = @{ @"tableView": tableViewController.view ,
                              @"topGuide": containerLeftViewController.topLayoutGuide,
                              @"bottomGuide": containerLeftViewController.bottomLayoutGuide,
                              };
[containerLeftViewController.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[tableView]|"
                                                                                         options:0
                                                                                         metrics:nil
                                                                                           views:viewsDict]];
[containerLeftViewController.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[topGuide][tableView][bottomGuide]"
                                                                                         options:0
                                                                                         metrics:nil
                                                                                           views:viewsDict]];

乾杯、ベン


1

UITableViewControllerを使用する方法は、以前に行った方法とは少し異なると思います。それは私にとってはうまくいったが、あなたはそれのファンではないかもしれない。私がやったことは、UItableViewControllerを指すコンテナービューを持つビューコントローラーを作成することです。このようにして、ストーリーボードに提供されているTopLayoutGuideを使用できます。コンテナービューに制約を追加するだけで、iOS7とiOS6の両方に対応できます。


1

TableViewの後に追加され、ステータスバーの下に配置された、目的の背景を持つ1つの追加ビューを使用することになりました。

    self.CoverView = [[UIView alloc]init];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {

    self.CoverView.frame = CGRectMake(0,0,self.view.bounds.size.width,20);
    }

    self.CoverView.backgroundColor = [UIColor whiteColor];
    self.TableView = [[UITableView alloc]initWithFrame:CGRectMake(0,
    self.CoverView.bounds.size.height,XXX, YYY)];
    [self.view addSubview:self.TableView];
    [self.view addSubview:self.CoverView];

それほどきれいではありませんが、xibなしのビュー、およびIOS6とIOS7の両方で作業する必要がある場合は、それはかなり単純なソリューションです。


1

私はこれをRetina / Non-Retinaディスプレイで行いました。

BOOL isRetina = FALSE;

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    if ([[UIScreen mainScreen] scale] == 2.0) {
        isRetina = TRUE;
    } else {
        isRetina = FALSE;
    }
}

if (isRetina) {
    self.edgesForExtendedLayout=UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars=NO;
    self.automaticallyAdjustsScrollViewInsets=NO;
}

1

次のソリューションは、マジック定数を使用せずにコードで十分に機能し、ユーザーがサイズクラスを変更することを考慮します(たとえば、回転やiPadでのアプリの並べ替えなど)。

- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];
    // Fix up content offset to ensure the tableview isn't underlapping the status bar.
    self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0);
}

1

Swift 3で機能-viewDidLoad();

let statusBarHeight = UIApplication.shared.statusBarFrame.height

let insets = UIEdgeInsets(top: statusBarHeight, left: 0, bottom: 0, right: 0)
tableView.contentInset = insets
tableView.scrollIndicatorInsets = insets

このコード:1.ステータスバーの高さを取得します。2.テーブルビューの上部に、ステータスバーの高さに等しいコンテンツインセットを与えます。3.スクロールインジケータに同じはめ込みを設定して、ステータスバーの下に表示します。


1

私のようUITableViewControllerに、UIViewControllerこれを試してみたくない人のために:

カスタムUITableViewControllerサブクラスは、マスクビューをtableViewのスーパービューに追加できます。viewDidAppearにマスクを追加し、viewWillDisappearのマスクを削除します。

private var statusBarMaskView: UIView!

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    if let superview = self.tableView.superview {
        self.statusBarMaskView = UIView(frame: CGRect.zero)
        superview.insertSubview(self.statusBarMaskView, aboveSubview: self.tableView)
        self.statusBarMaskView.backgroundColor = self.tableView.backgroundColor

        // using a nice constraint layout library to set the frame
        self.statusBarMaskView.pinTop(to: superview)
        self.statusBarMaskView.pinLeft(to: superview)
        self.statusBarMaskView.pinRight(to: superview)
        self.statusBarMaskView.addHeightConstraint(with: 22.0)
        ////
    }
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    self.statusBarMaskView.removeFromSuperview()
    self.statusBarMaskView = nil
}

0

UITableViewの上部にUISearchBarがあり、以下が機能しました。

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

共有してお楽しみください...



0

Abrahamchezのソリューション https://developer.apple.com/library/ios/qa/qa1797/_index.html は私にとって次のように機能しました。私は最初のビューとして単一のUITableviewcontrollerを持っていました。私はオフセットコードを試してナビコンに埋め込んでみましたが、ステータスバーの透明度も解決されませんでした。

Viewcontrollerを追加して、それを初期ビューにします。これにより、重要な上下レイアウトガイドが表示されます。

古いTableviewを新しいコントローラーのビューにドラッグします。

テーブルを新しいコントローラーに後付けするために、すべてのものを実行します。

古いビューのcontroller.hファイルを、UITableViewControllerではなくUIViewControllerから継承/サブクラス化するように変更します。

UITableViewDataSourceとUITableViewDelegateをビューコントローラーの.hに追加します。

検索バーなど、ストーリーボードで必要なものをすべて再接続します。

重要なのは、Apple Q&Aのように、制約を設定することです。ツールバーを挿入する手間はありませんでした。正確な順序がわからない。しかし、おそらく私が作成したときに、レイアウトアイコンに赤いアイコンが表示されました。それをクリックして、Xcodeに制約をインストール/クリーンアップさせました。

次に、Vertical Space制約が見つかり、その最大値を-20から0に変更して完全に機能するまで、どこでもクリックしました。


0

ナビゲーションコントローラーとテーブルビューコントローラーを備えたUISplitViewControllerを使用しています。これは私がここで多くの解決策を試した後のマスタービューでうまくいきました:

float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0f) {

    // Move the view down 20 pixels
    CGRect bounds = self.view.bounds;
    bounds.origin.y -= 20.0;
    [self.navigationController.view setBounds:bounds];

    // Create a solid color background for the status bar
    CGRect statusFrame = CGRectMake(0.0, -20.0, bounds.size.width, 20);
    UIView* statusBar = [[UIView alloc] initWithFrame:statusFrame];
    statusBar.backgroundColor = [UIColor whiteColor];
    [statusBar setAlpha:1.0f];
    [statusBar setOpaque:YES];
    [self.navigationController.view addSubview:statusBar];
}

これはHot Licksのソリューションに似ていますが、サブビューをnavigationControllerに適用します。


これは、iOS 8で私のために働いた唯一の答えです!
SamB、2015年

0
override func viewDidLoad() {
 // your code

 if let nc = self.navigationController {
   yourView.frame.origin.y = nc.navigationBar.frame.origin.y + nc.navigationBar.frame.height
  }
}

0

これがSwift 2.3です。(Xcode 8.0)ソリューション。UITableViewのサブクラスを作成しました。

class MYCustomTableView: UITableView
{   
    override func drawRect(rect: CGRect) {
        super.drawRect(rect)
        contentInset    = UIEdgeInsetsZero
    }
}

コンテンツのインセットは常にゼロにする必要があります(デフォルト)。手動でゼロに設定しています。チェックを行うcheckメソッドを追加することもできます。チェックメソッドを追加して、それが必要なもの以外の場合は、正しい四角形を取得することもできます。変更は、テーブルビューが描画されたときにのみ反映されます(これは頻繁には起こりません)。

IBのTableViewを更新することを忘れないでください(TableViewController内、またはViewController内のTableView内のみ)。


0

iOS 11でこの問題に直面していましたが、iOS 8〜10.3.3のレイアウトは適切でした。私の場合、垂直スペース制約をSuperview.TopではなくSuperview.Top Marginに設定しました。これはiOS 8〜11で機能します。

ここに画像の説明を入力してください


0

特にタブバー内にテーブルビューを追加する場合は、最初にビュー追加してからそのビュー内にテーブルビューを追加するのが最も簡単な方法です。これはあなたが探しているトップマージンガイドを提供します。

ここに画像の説明を入力してください


-1

すべてのソリューションを参照してください。私のプロジェクトはxibを使用しているだけなので、ストーリーボードを使用したソリューションは機能しません。self.edgesForExtendedLayout = UIRectEdgeNone; ナビゲーションバーが表示されている場合は、コントローラーに対してのみ機能します。ただし、ビューにステータスバーしかない場合は機能しません。だから私は2つの条件を組み合わせる。

- (void) viewDidLayoutSubviews {
float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0f) {
    CGRect bounds = self.view.bounds;
    if(self.navigationController == nil || self.navigationController.isNavigationBarHidden == YES){
        bounds.origin.y -= 20.0;
        [self.view setBounds:bounds];
    }
    else{
        self.edgesForExtendedLayout = UIRectEdgeNone;
    }
}

これが機能するのを助けます。


-2

iOS 6もサポートする必要がある場合は、条件付きでiOS 6を下に移動する必要があります。つまり、iOS 7では(frame操作または自動レイアウトを使用して)20ポイント下に移動するだけでよく、iOS 6ではそのままにしておきます。IBでこれを実行できるとは思わないので、コードで実行する必要があります。

編集

これは、iOS6 / iOS7デルタを使用して、IBで実際に行うことができます。iOS 7で位置を設定してから、iOS 6でデルタYを-20ポイントに設定します。詳細については、このSOの質問を参照してください。


フレームを下げても、残念ながら変更されません。
Nicholas Smith

それについて何が機能しませんか?テーブルビューが下に移動しませんか?
Scott Berrevoets、2013

ええ、それは同じ位置のままです。私が試したself.view.frameself.tableView.frameの両方で、viewWillAppearviewDidLoad。安全のためにsetContentNeedsDisplay、強制的に再描画するように設定しました。
Nicholas Smith

自動レイアウトは有効ですか?
スコットBerrevoets 2013

ええ、それは自動レイアウトとストーリーボードです。
Nicholas Smith
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.