219

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

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

百聞は一見に如かず。 下のステータスバーフロー

4

27 に答える 27

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ステータス バーの後ろにスクロールされますが、一番上までスクロールしても下には表示されません。

于 2013-10-17T10:46:03.340 に答える
20

一番上の答えに追加:

2番目の方法が最初は機能していないように見えた後、追加の調整を行い、解決策を見つけました.

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


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

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

テーブル ビュー センター画像

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

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

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

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

アウトレットの作成 テーブルビュー

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

dataSource デリゲート

ステータスバーにクリッピングしない部分について。

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

サイズ変更

  1. これで、Table View から上部へのドラッグを制御し、Top Space to Top Layout Guide を選択できるようになりました。

トップ スペースからトップへのレイアウト ガイド

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

不足している制約を追加する

これで、通常のようにテーブル ビューを設定できるようになりました。ステータス バーがクリップされることはありません。

于 2014-12-27T23:27:04.057 に答える
8

これは「Swift」でそれを書く方法です@lipkaの答えへの調整:

tableView.contentInset = UIEdgeInsetsMake(20.0, 0.0, 0.0, 0.0)
于 2015-01-12T21:12:33.627 に答える
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
    }
}
于 2016-07-29T23:42:05.453 に答える
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]];

乾杯、ベン

于 2014-05-16T22:52:25.753 に答える
1

次の解決策は、魔法の定数を使用せずにコードで十分に機能し、ユーザーがサイズ クラスを変更することを考慮しています。

- (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);
}
于 2016-07-21T02:21:20.830 に答える
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 の両方で作業する必要がある場合は、かなり単純なソリューションです。

于 2013-11-16T10:53:42.060 に答える
1

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

于 2013-09-22T22:03:19.447 に答える
0
override func viewDidLoad() {
 // your code

 if let nc = self.navigationController {
   yourView.frame.origin.y = nc.navigationBar.frame.origin.y + nc.navigationBar.frame.height
  }
}
于 2016-02-24T10:41:12.230 に答える