686

iOS7 以降ではUITableView、 style を持つ my の上部に追加のスペースがありますUITableViewStyleGrouped

次に例を示します。

ここに画像の説明を入力

テーブルビューは最初の矢印から始まり、35 ピクセルの説明のつかないパディングがあり、緑色のヘッダーが(セクションが 0 の場合)UIViewによって返されます。viewForHeaderInSection

この 35 ピクセルの量がどこから来ているのか、どのように切り替えずにそれを取り除くことができるのか、誰か説明できますUITableViewStylePlainか?


更新(回答):

iOS 11 以降の場合:

tableView.contentInsetAdjustmentBehavior = .never
4

72 に答える 72

865

以下にお世話になりました。

YouStoryboard.storyboard > YouViewController > 属性インスペクター > チェックを外す - スクロール ビューのインセットを調整します。

ここに画像の説明を入力

于 2013-10-01T13:36:38.223 に答える
184

から継承するcontentInsetプロパティを変更してみてください。UITableViewUIScrollView

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

これは回避策ですが、機能します

于 2013-09-21T17:32:25.187 に答える
179

IOS 7 の場合、View Controller でテーブルビューを割り当てている場合は、調べることができます

self.edgesForExtendedLayout = UIRectEdgeNone;

あなたの問題は私のものと似ていました

アップデート:

iOS 9.x のスウィフト:

self.edgesForExtendedLayout = UIRectEdge.None

スウィフト 3 :

self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)
于 2013-09-20T21:16:04.653 に答える
80

アプリが iOS7 以降を実行しているかどうかを検出し、この 2 つのメソッドをテーブル ビュー デリゲート (通常は UIViewController コード) に追加できます。

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return CGFLOAT_MIN;
}

-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return CGFLOAT_MIN;
}

これはおそらくエレガントな解決策ではありませんが、私にとってはうまくいきます

迅速なバージョン:

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}

override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}
于 2013-10-25T18:26:25.477 に答える
60

元のバグの原因を発見し、それを紹介するサンプル プロジェクトを作成しました。iOS7のバグだと思います。

iOS7 の時点で、Grouped スタイルで UITableView を作成しても、最初のレイアウトにデリゲートが設定されていない場合、デリゲートを設定して reloadData を呼び出すと、上部に 35px のスペースがあり、決して消えることはありません。

バグを紹介するために作成したこのプロジェクトを参照してください: https://github.com/esilverberg/TableViewDelayedDelegateBug

具体的には、このファイル: https://github.com/esilverberg/TableViewDelayedDelegateBug/blob/master/TableViewDelayedDelegateBug/ViewController.m

24 行目がアクティブな場合、

[self performSelector:@selector(updateDelegate) withObject:nil afterDelay:0.0];

上部に 35 ピクセルのスペースが追加されます。行 27 がアクティブで、行 24 がコメントアウトされている場合、

self.tableView.delegate = self;

上部にスペースがありません。デリゲートが設定され、 reloadData が呼び出された後、 tableView が結果をどこかにキャッシュし、それ自体を再描画しないようです。

于 2013-10-05T05:52:57.133 に答える
49

「スクロールビューのインセットを調整する」のチェックを外す

ここに画像の説明を入力

于 2016-08-26T03:51:46.130 に答える
46

別の簡単なコメント... XCode 6.1でも、UIScrollViewsUITextViewsおよびUITableViews.

ここに画像の説明を入力

場合によっては、この問題を解決する唯一の方法は、ストーリーボードに移動して問題のコントロールをドラッグし、ページの最初のサブビューにならないようにすることです。

ここに画像の説明を入力

(この方向性を示してくれたOdedに感謝します... 症状を示して修正するために、いくつかのスクリーンショットを追加するために、このコメントを投稿しています。)

于 2015-01-07T08:14:21.210 に答える
40

この Apple によるiOS7 の移行ガイドによると、スクロール ビューのコンテンツ インセットは自動的に調整されます。automaticAdjustsScrollViewInsetsのデフォルト値はYES に設定されています。

UITableView を持つ UIViewController は、このプロパティを NO に設定する必要があります。

self.automaticallyAdjustsScrollViewInsets = NO;

これでうまくいきます。

編集1:

また、試すことができます-

self.navigationController.navigationBar.translucent = YES;

これにより、上部の余分なパディングも削除されます。

于 2014-01-15T12:32:13.130 に答える
39

上記の以前の回答の多くはハックすぎます。Apple がこの予期しない動作を修正することを決定した場合、将来いつでも壊れる可能性があります。

問題の原因:

  1. aUITableViewは、高さが 0.0 のヘッダーを好みません。高さ0のヘッダーを作成しようとしている場合は、解決策にジャンプできます。

  2. 後でヘッダーに 0.0 以外の高さを割り当てたとしてもUITableView、最初は高さ 0.0 のヘッダーが割り当てられるのは好きではありません。

解決:

次に、最も簡単で信頼できる修正は、ヘッダーの高さをテーブル ビューに割り当てるときに、ヘッダーの高さが 0 にならないようにすることです。

次のようなものが機能します。

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.tableView.bounds.size.width, CGFLOAT_MIN)];
self.tableView.tableHeaderView = tableViewHeaderView;

このようなことは、ある時点 (通常はスクロール後) で問題につながります。

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectZero];
self.tableView.tableHeaderView = tableViewHeaderView;
于 2015-07-04T17:33:47.020 に答える
29

ストーリーボード:

チェックを外すだけです:Adjust Scroll View InsetsView Controllerのオプションで

ここに画像の説明を入力

コード:

self.automaticallyAdjustsScrollViewInsets = false
于 2015-05-21T10:29:18.017 に答える
24

これは、Swift 3 を使用した iOS 10 のソリューションです。

から次のメソッドを実装することにより、上下のパディングを取り除くことができますUITableViewDelegate

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
{ 
    return CGFloat.leastNormalMagnitude
}

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat
{
   return CGFloat.leastNormalMagnitude
}
于 2017-01-12T16:37:34.310 に答える
16

そのため、ここであらゆる方法を試しましたが、今回はどれも役に立ちませんでした。私の場合は、iOS 9 のグループ化されたテーブル ビューでした。なぜ、どのようにしてこれを見つけたのかはよくわかりませんが、少なくとも高さtableViewHeaderのある を設定するとうまくいきました。役に立たなかった、本当に役に立たなかった:UIView0.01CGRectZero

tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 0.01))
于 2016-07-21T13:07:29.563 に答える
14

VC の viewDidLoad に以下を追加するだけです。

self.automaticallyAdjustsScrollViewInsets = NO;
于 2014-09-20T05:20:10.433 に答える
10

Swift:iOSスクロールビューにテーブルビューがありました..同じ画面で「戻る」をクリックしたときに。スクロールビューは上部にもっとスペースを取ります..これを解決するために私は使用しました:

 self.automaticallyAdjustsScrollViewInsets = false

ビュー コントローラーがスクロール ビューのインセットを自動的に調整する必要があるかどうかを示すブール値。デフォルト値は true です。これにより、View Controller は、ステータス バー、ナビゲーション バー、およびツールバーまたはタブ バーによって消費される画面領域に応じて、スクロール ビューのインセットを調整できます。ビュー階層に複数のスクロール ビューがある場合など、スクロール ビューのインセット調整を自分で管理する場合は、false に設定します。

于 2014-11-25T07:20:36.133 に答える
10

@Aurelien Porteの回答に感謝します。これが私の解決策です

この問題の原因:-

  1. UITableView は、高さが 0.0 のヘッダーを持つことを好みません。高さ0のヘッダーを作成しようとしている場合は、解決策にジャンプできます。
  2. 後でヘッダーに 0.0 以外の高さを割り当てたとしても、最初は UITableView に高さ 0.0 のヘッダーが割り当てられることを好みません。

ViewDidLoad:-

self.edgesForExtendedLayout = UIRectEdge.None

self.automaticallyAdjustsScrollViewInsets = false

このようなものは必要ありません:-

self.myTableview.contentInset = UIEdgeInsetsMake(-56, 0, 0, 0)

heightForHeaderInSectionデリゲートで: -

if section == 0
    {
        return 1
    }
    else
    {
        return 40; // your other headers height value
    }

viewForHeaderInSectionデリゲートで: -

if section == 0 
{  
   // Note CGFloat.min for swift
   // For Objective-c CGFLOAT_MIN 
   let headerView = UIView.init(frame: CGRectMake(0.0, 0.0, self.myShaadiTableview.bounds.size.width, CGFloat.min)) 
   return headerView
}
else
{ 
   // Construct your other headers here 
}
于 2016-05-30T09:42:54.670 に答える
9

私の答えはより一般的な答えになりますが、これにも適用できます。

ルート ビュー( ViewControllerの) またはルート ビューの最初の子 (サブビュー)が UIScrollView (または UIScrollView 自体) のサブクラスである場合、および

self.navigationController.navigationBar.translucent = YES;

フレームワークは、事前計算された contentInsetを自動的に設定します。


これを回避するには、次のことができます

self.automaticallyAdjustsScrollViewInsets = NO;

しかし、私の場合、他の開発者が使用できる UIView コンポーネントを持つ SDK を実装していたため、これを行うことができませんでした。その UIView コンポーネントには UIWebView (最初のサブビューとして UIScrollView を持つ) が含まれています。そのコンポーネントが UIViewController のビュー階層の最初の子として追加されると、自動インセットがシステムによって適用されます。

UIWebView を追加する前に、フレーム (0,0,0,0) を持つダミー ビューを追加して、これを修正しました。

この場合、システムは最初のサブビューとして UIScrollView のサブクラスを見つけられず、インセットを適用しませんでした

于 2015-12-02T14:20:20.923 に答える
9

UITableViewStyleGroupedそれは新しいスタイリングの一部にすぎないと思います。グループ化されたすべてのテーブルビューにあり、そのスペースを直接制御する方法はないようです。

そのスペースが で表されている場合、UIViewすべてのsubviewsUITableView検索して特定のビューを見つけて直接編集することができます。ただし、スペースがヘッダーとセルの開始前にハードコードされたオフセットにすぎず、編集する方法がない可能性もあります。

すべてのサブビューを検索するには (出力を読みやすくするために、テーブルにセルがないときにこのコードを実行します):

- (void)listSubviewsOfView:(UIView *)view {

    // Get the subviews of the view
    NSArray *subviews = [view subviews];

    // Return if there are no subviews
    if ([subviews count] == 0) return;

    for (UIView *subview in subviews) {

        NSLog(@"%@", subview);

        // List the subviews of subview
        [self listSubviewsOfView:subview];
    }
}
于 2013-09-18T20:12:28.410 に答える
9

具体的には、上部から tableviewHeader スペースを削除するために、次の変更を行いました。

YouStoryboard.storyboard > YouViewController > TableView を選択 > サイズインスペクター > コンテンツインセット - 決して設定しないでください。

ここに画像の説明を入力

于 2018-04-14T12:08:56.290 に答える
8

Swift 4 コード: セクション ヘッダーのない tableview の場合、次のコードを追加できます。

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}

ヘッダーの間隔が 0 になります。

特定の高さのヘッダーが必要な場合は、その値を渡します。

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return header_height
}

および viewForHeaderinSection デリゲートからのビュー。

于 2018-02-27T01:45:22.963 に答える
7

UIEdgeInsets -35 0 0 0 を作るのは面倒だと思います。私の場合、tableView: heightForHeaderInSection: メソッドを実装しましたが、0 を返す可能性があります。

0 を 0.1f に変更すると、問題はなくなりました。

于 2014-08-02T23:45:36.327 に答える
6
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{

    return CGFLOAT_MIN;
}

それはすべての人々です!

于 2016-05-09T16:45:33.170 に答える
6

から削除 UITableViewInterface Builderもう一度作成したところ、奇妙な 35px がなくなりました。

に奇妙なバグがあるようですInterface Builder

于 2014-10-20T13:37:59.300 に答える
6

これを使用してください。これは役立つと思います...

 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
 {
    return 0.005f;// set this according to that you want...
 }
于 2015-10-26T11:57:45.623 に答える
4

ビューの絶対上部にテーブルビューを固定する(または開始する)だけです。追加の不要なスペースは、まさにナビゲーション バーの高さです。

于 2015-01-24T14:19:06.583 に答える
4

私もこれに頭をぶつけてきました。これはiOS7のバグであることは間違いありません。最終的に私を助けたのは、xibのビューの順序です。テーブル ビューが正しく表示された 1 つのビューと、テーブル ビューに余分な 35 ピクセルのスペースがある別のビューがありました。それから(UITableViewに関して)唯一の違いは、正しく表示されていたビューではUITableViewが最初の子であったのに対し、表示が悪いビューでは2番目だったことです。

ビューの順序を変更するだけで、それは私にとってはうまくいきました。回避策として余分なコード行を追加したくない...

于 2013-10-27T10:31:08.487 に答える
3

UITableViewStyleGrouped のスタイルを選択した場合、HeaderおよびFooter高さデリゲート メソッドを実装する必要があり、戻り値は 0 より大きい必要があります。このような:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
    return CGFLOAT_MIN;
}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
    return CGFLOAT_MIN;
}
于 2017-09-21T12:37:57.087 に答える
2

コンテナーを含む VC があり (ところで、これは Nav コントローラーの一部です)、そこに埋め込まれているのは TableVC です。

属性パネルを見て、TableVC を選択します。

  • スクロールインセットを自動的に調整するのチェックを外します
  • トップバーの下のエッジを拡張のチェックを外します

次に、親ビューに対するコンテナの自動制約を次のように設定します。

コンテナー View.top = ParentView.Top Margin

これにより、次のことが達成されます。

  • テーブルを上に引き上げたままにしますが、ナビゲーション バーのすぐ下に
  • 更新後、テーブルはこの位置に戻り、以前のようにナビゲーションバーの上下ではありません
  • スクロールした後、テーブルは実際の一番下に達します。

このセットアップで多くの試行錯誤を繰り返しましたが、最終的にこれらの小さな詳細がlekksi @ UITableViewのセルの前にある空白を削除することによって投稿されたことがわかりました

于 2016-05-16T21:10:23.703 に答える
2
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return CGFloat.leastNonzeroMagnitude
}
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return CGFloat.leastNonzeroMagnitude
}
于 2020-09-09T21:51:05.907 に答える
2

ストーリーボードあり:

UITableView の上部制約に「上部レイアウト ガイドの下」と表示されていないことを確認してください。代わりに、"Top space to: Superview" (Superview.Top) と表示する必要があります。

もちろん、UITableView を含む UIViewController で、「スクロール ビューのインセットを調整する」のチェックを外します。

于 2016-04-12T10:06:52.100 に答える
1

あなたが何をしようとしているかに応じて、この質問には多くの答えがあることに気付きました.

ここに画像の説明を入力

私のビュー コントローラーには、200 ポイントの tall で構成されるUITableViewgrouped と、広告のタイトル、価格、場所、投稿時間を含む単一の attributedがあります。その下には、テーブル ビューの内容が表示されます。tableHeaderViewUIScrollViewUILabel

グループ化されたテーブル ビュー ヘッダーのデフォルトのサイズでは、「MORE INFO」ヘッダーが「5 日前」ラベルよりもはるかに下にあります。各セクションのヘッダーとフッターの高さをオーバーライドして修正しました (既に上の画像)。

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return section == kMoreInfoSection ? 33 : UITableViewAutomaticDimension;
}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    return UITableViewAutomaticDimension;
}

受け入れられた回答の @erurainon のコメントとhttps://stackoverflow.com/a/14404104/855680UITableViewAutomaticDimensionから高さをオーバーライドすることについて学びました。受け入れられた回答が示唆するものとは異なり、ビューコントローラーに設定する必要はありませんでした。self.automaticallyAdjustsScrollViewInsetsNO

また、 を設定しUIEdgeInsets、テーブル ビューの上部に負の値を指定しようとしましたが、うまくいきませんでした。. を含むテーブル ビュー全体が上に移動しますtableHeaderView

于 2013-12-26T06:44:57.213 に答える
1

テーブルに制約を与えていることを確認してください。私は、テーブルの下部に説明のつかないパディングがあるという同様の問題に直面していませんでした。

于 2016-05-20T09:22:59.997 に答える
1

2021 Xcode 12.3 アップデート

この問題を解決するには、標準のセクション フッターを無効にする必要があります。次のスニペットがその役割を果たします。

override func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    return nil
}

override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return 0
}

の使用法

tableView.contentInsetAdjustmentBehavior = .never

ここでは全く関係ありません

于 2021-01-06T08:52:46.187 に答える
1

私はすべての答えを調べました。どれも私にとってはうまくいきませんでした。私がしなければならなかったのは:

self.myTableView.rowHeight = UITableViewAutomaticDimension
self.myTableView.estimatedRowHeight = 44.0

さらに、この問題は tableView の上部では発生していませんでした。tableViewの各セクションの上部で発生していました。

FWIW この問題は iOS9 でのみ発生していました。私たちのアプリは、iOS10 と iOS 11 で問題なく動作しました。

この素晴らしい質問とその上位の回答をご覧になることを強くお勧めします。

動的セル レイアウトと可変行高さのために UITableView で自動レイアウトを使用する

于 2017-11-21T21:55:21.337 に答える
1
set
  override func viewDidLoad() {
  self.tableView.delegate = self
  self.tableView.dataSource = self
}
于 2019-09-13T17:27:47.913 に答える
0

この良い答えかどうかはわかりませんが、私にはうまくいきます

Table View を選択し、ルーラーに移動し、Y 値をゼロに変更します

ここに画像の説明を入力

于 2016-04-07T16:53:15.017 に答える
0

私は余分なトップスペースの問題に直面していました。解決策にたどり着くには、たくさんの答えをクラブで作らなければなりませんでした。(与えられたすべての回答を確認するのに 5 時間)

気になったらまず

テーブル ビュー - モードは「グループ」ですが、「プレーン」に変更してください

ヘッダーまたはフッター セクションを変更したり、それらに関連するデリゲート メソッドを追加したりする必要はありません

次に、InterfaceBuilder に TableView がある ViewController で、[スクロール ビュー インセットの調整] のチェックを外します - [エッジの拡張] のチェックを外します: トップ バーの下

*また、派生データを削除し、アプリをシミュレーターまたは電話に再インストールして、行った変更を効果的に反映していることを確認してください。

IDEも原因で、UIの変更が反映されないことがあります...ここに画像の説明を入力

于 2020-03-06T13:17:25.840 に答える
0

すべてを試した後、最終的にこれを修正する方法を考え出しました!

何らかの理由で、テーブルビューの contentOffset の 'y' が -20 になっていることに気付きました。

tableView.contentOffset = .zero

Objective-C

self.tableView.contentOffset = CGPointMake(0, 44);
于 2018-02-13T05:41:18.767 に答える
-1

テーブルビューからヘッダー セルを削除した後、同じ問題が発生しました。解決するために、Attributes Inspector の TableView Styleを「Grouped」から「Plain」に変更し、余分なスペースを削除しました。

于 2016-05-11T20:12:04.853 に答える