web-dev-qa-db-ja.com

IOS 7でスタイルUITableViewStyleGroupedの私のUITableViewの上部に余分なパディングがあるのはなぜですか

IOS7以降、私のUITableViewの先頭には、UITableViewStyleGroupedというスタイルの追加スペースがあります。

これが一例です。

enter image description here

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

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

599
esilver

私は最初のバグの原因を突き止め、それを紹介するサンプルプロジェクトを作成しました。 iOS7のバグがあると思います。

IOS 7の時点で、グループスタイルで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;

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

52
esilver

私は次のことに助けられました:

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

enter image description here

856
Alexander

私はもう少し遊んでみましたが、これはtableViewのtableHeaderView = nilを設定することによる副作用のようです。

私のtableViewは動的に現れるtableHeaderViewを持っているので、self.tableView.tableHeaderView = nil;をする代わりにtableHeaderViewを隠す必要があるときは、

self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.tableView.bounds.size.width, 0.01f)];

contentInset.topも動的に使用するので、私はこの解決策が多少恣意的なcontentInset.topを設定するよりも好きです。 contentInset.topを再計算するたびに余分な35pxを削除することを忘れないでください。

299
Mr. T

IOS 7の場合、View ControllerでTableviewを使用している場合は、次のようになります

self.edgesForExtendedLayout = UIRectEdgeNone;

あなたの問題は私のものと似ていたようです

更新:

IOS 9.xでSwift:

self.edgesForExtendedLayout = UIRectEdge.None

スイフト3:

self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)
177
yeahdixon

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

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

これは回避策ですが、うまくいきます

164
nvrtd frst
self.automaticallyAdjustsScrollViewInsets = NO;

試して、あなたはそれに対処することができます!

132
guanhuiwit

アプリが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
}
71
LightMan

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

enter image description here

49
Tú Đt

もう1つの簡単なコメント... XCode 6.1でも、UIScrollViewsUITextViewsUITableViewsの先頭に縦方向のスペースが表示されるというバグがあります。

enter image description here

時々、この問題を解決する唯一の方法はストーリーボードに入って問題コントロールをドラッグすることで、もはやページの first サブビューではなくなることです。

enter image description here

Oded に感謝します。このコメントを投稿しています...いくつかのスクリーンショットを追加して、症状の説明と修正を行っています。)

45
Mike Gledhill

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

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

self.automaticallyAdjustsScrollViewInsets = NO;

これでうまくいくでしょう。

編集1:

また、試してみることができます -

self.navigationController.navigationBar.translucent = YES;

これにより、上部の余分な余白も削除されます。

40
girish_vr

グループ化されたTableViewを使用している間、viewWillAppearでボーダーカットを避けるためにこれを使用してください

self.tableView.contentInset = UIEdgeInsetsMake(-35, 0, 0, 0);
38
Aqib Mumtaz

上記の多くの答えはあまりにも厄介です。 Appleがこの予期しない動作を修正することにした場合、将来いつでもそれらは壊れるでしょう。

問題の根本:

  1. UITableViewは高さ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;
33
Aurelien Porte

絵コンテ:

View ControllerのオプションにあるAdjust Scroll View Insetsのチェックを外します。

enter image description here

コード:

self.automaticallyAdjustsScrollViewInsets = false

これは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
}
20
AndreasLukas

私の場合、これが私の役に立ちました。私はios6もサポートしています。

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars = NO;
    self.automaticallyAdjustsScrollViewInsets = NO;
}
14
Lukas

だから私はここですべての方法を試していましたが、今回は誰も助けませんでした。私の場合は、iOS 9のグループ化されたテーブルビューでした。これを見つけた理由と方法はわかりませんが、私にとっては、tableViewHeaderに少なくとも0.01の高さのUIViewを設定しました。 CGRectZeroは役に立たず、何も役に立たなかった:

tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 0.01))
14
sunshinejr

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

self.automaticallyAdjustsScrollViewInsets = NO;
14
judepereira

@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 
}
10
Ashish Pisey

Swift:iOSスクロールビューでテーブルビューをしていました。同じ画面で[戻る]をクリックしたとき。これを解決するために、スクロールビューの上にもっとスペースを取ってください。

 self.automaticallyAdjustsScrollViewInsets = false

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

10
Vinod Joshi

私の答えはもっと一般的な答えになるでしょうが、これにも適用することができます。

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

self.navigationController.navigationBar.translucent = YES;

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


これを避けるためにあなたはできる

self.automaticallyAdjustsScrollViewInsets = NO;

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

UIWebViewを追加する前に、 ダミービューをframe(0,0,0,0) で追加することでこれを修正しました。

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

9
zvjerka24

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

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

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

- (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];
    }
}
8
Kevin

これは、ストーリーボードを介してiOS 11およびXcode 9.1で簡単に修正できる方法です。

表形式/サイズインスペクタ/コンテンツインセットを選択します。

8
Pink Panther

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

0を0.1fに変更すると、問題は解決しました。

7
Jiangfan Du

私はarielyzと同じ修正をしました。 UITableViewを親ビューの最初のサブビューにならないように移動したら、それは消えました。私のスペースは35ではなく、20ピクセルでした。

縦置きxibでは再現できませんでした。横置きxibのみです。簡単なデモアプリで再現できるのであれば、あとでレーダーのバグを報告するつもりです。

7
Oded
override func viewWillAppear(animated: Bool) {
        self.edgesForExtendedLayout = UIRectEdge.None

 //  OR

self.sampleTableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);

   //OR

 self.automaticallyAdjustsScrollViewInsets = false
        }
6
A.G

具体的には、上からtableviewHeaderスペースを削除するために、私はこれらの変更を加えました:

YouStoryboard.storyboard> YouViewController> [TableView]> [サイズインスペクタ]> [コンテンツインセット]を選択します - [しない]に設定します。

enter image description here

6
user832

私のために働いたことが唯一のものでした:

スイフト

tableView.sectionHeaderHeight = 0
tableView.sectionFooterHeight = 0

Objective-C

self.tableView.sectionHeaderHeight = 0;
self.tableView.sectionFooterHeight = 0;

また、私はまだ最初のセクションのための余分なスペースがありました。これはtableHeaderViewプロパティを間違って使用していたためです。次のものを追加することでそれを修正しました:

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 0.01))
6
Danut Pralea

これを使う私はこの助けと思う...

 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
 {
    return 0.005f;// set this according to that you want...
 }
6
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{

    return CGFLOAT_MIN;
}

それはすべての人です!

これには複数の答えがあります。

1)ビューdidloadでUIImageviewを追加できます

UIImageView * imbBackground = [UIImageView new];
[self.view addSubview:imbBackground];

2)ヘッダーとフッターの高さを0.1に設定できます

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

3)高さ0.1のヘッダとフッタのビューを追加できます

tblCampaigns.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, tblCampaigns.bounds.size.width, 0.01f)];
tblCampaigns.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, tblCampaigns.bounds.size.width, 0.01f)];
5
Hari c

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

ビューの順序を変更するだけで、これは私にとってトリックでした。回避策として、余分なコードを追加しないことをお勧めします。

4
arielyz

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デリゲートからのビュー。

4

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

4
latenitecoder
tableView.contentInsetAdjustmentBehavior = .never

私のための解決策だった(iOS 12/xcode 10)ヘッダー付きのプレーンなテーブルビュー

3
david

下記(Swift)を実行すると問題は解決します。 しかし これはヘッダが不要な場合に機能します。

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

そうした場合は、最初のセクションを放棄し、他のセクションをコンテンツに使用する必要があります。

UITableViewDataSourceの実装:

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return <number_of_data_sections>+1
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // the first section we don't use for data
    if section == 0 {
        return 0
    }

    // starting from 1, there are sections we use
    if section == 1 { 
        let dataSection = section - 1

        // use dataSection for your content (useful, when data provided by fetched result controller). For example:
       if let sectionInfo = myFRC!.sections![dataSection] as? NSFetchedResultsSectionInfo {
            return sectionInfo.numberOfObjects
        }
    }

    return 0
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let dataIndexPath = NSIndexPath(forRow: indexPath.row, inSection: (indexPath.section - 1) )
    // return cell using transformed dataIndexPath
}

func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    if section == 1 {
        // return your header height
    }
    return CGFloat.min
}


func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    if section == 1 {
        // return your header view
    }
    return nil
}

func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    // in my case, even when 1st section header was of zero heigh, I saw the space, an that was a footer. I did not need footer at all, so always gave zero height
    return CGFloat.min
}

以上です。データにアクセスするとセクション番号が変換されるため、モデルは変更について何も知りません。

3
Yevhen Dubinin

Interface Builderから削除UITableViewもう一度作成した、そして変わった35pxがなくなりました。

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

3
LorikMalorik

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

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

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

TableHeaderViewを非表示にする必要がある場合は、次のSwift 3コードを使用してください。

tableView.tableHeaderView = UIView(frame: CGRect(Origin: .zero, size: CGSize(width: 0.0, height: CGFloat.leastNormalMagnitude)))

絵コンテ付き:

UITableViewの上部の制約に「Under top layout guide」と表示されていないことを確認してください。代わりに、 "Top space to:Superview"(Superview.Top)と言うべきです。

もちろんUITableViewを含むUIViewControllerでは、 "Adjust Scroll View Insets"のチェックを外してください。

2
konsti

self.automaticallyAdjustsScrollViewInsets = NO;

これはiOS 11で廃止予定だったので、あなたはあなたのコードの中で新しいプロパティcontentInsetAdjustmentBehaviorを使うべきです、それは問題を解決するべきです。

if #available(iOS 11.0, *) {
    collectionView.contentInsetAdjustmentBehavior = .never
}

UIScrollViewにcontentInsetAdjustmentBehaviorという新しいプロパティが追加されました。これはiOS 11で追加され、コンテンツオフセットの調整を決定します。

2
Aks

コンテナが入ったVCがあり(これはNavコントローラの一部です)、その中に埋め込まれているのがTableVCです。

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

  • スクロールインセットを自動的に調整する
  • トップバーの下の延長エッジをオフにします。

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

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

これは私にとって次のことを実現します。

  • テーブルを一番上まで引き上げますが、ナビゲーションバーのすぐ下に配置します。
  • 更新後、テーブルはこの位置に戻り、ナビゲーションバーの下の+の位置ではなくなります。
  • 実際の一番下でテーブルの一番下までスクロールした後、それより短くない

このセットアップで私には試行錯誤がたくさんありましたが、lekksi @ UITableViewのセルの前に空のスペースを削除 によって投稿されたこれらの詳細が最終的に見つかりました。

2
the_dude_abides

私はこの良い答えが私にはうまくいくかどうかわからない

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

enter image description here

1
Mina Fawzy

私はあなたがやろうとしていることに応じてこの質問に多くの答えがあることに気づいたので、誰かが同じ効果を得るために行っている場合に備えて私は私のものを共有する。

enter image description here

私のView Controllerでは、UITableViewが、高さ200ポイントのtableHeaderView、および広告のタイトル、価格、場所、投稿された時間を含む単一のUIScrollViewで構成されているグループ化されたUILabelがあります。その下にテーブルビューの内容があります。

グループ化されたTable Viewヘッダーのデフォルトのディメンションでは、 "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を設定してTable Viewの先頭に負の値を設定しようとしましたが、うまくいきませんでした - tableHeaderViewも含めてTable View全体が上に移動します。

1
Matthew Quiros

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

1
Yash Tamakuwala

私はすべての答えを調べました。誰も私のために働きませんでした。私がしなければならなかったのは、

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

また、この問題はtableViewの上部では発生していませんでした。それはtableViewの各 section の一番上で起こっていました。

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

この素晴らしい質問とその最高の答えを見ることを強くお勧めします。

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

1
Honey

私の場合は、ストーリーボードのプロトタイプ視覚化で "HeaderView"と呼ばれる不要なセルがありました。削除したときには、すべて問題ありませんでした。

1
Robert Juz

self.automaticallyAdjustsScrollViewInsets = NO;が機能しない場合、tableviewヘッダーまたはセクションヘッダーの高さがCGFLOAT_MINではなく0であることを確認してください。

たとえば、TableViewヘッダーを0にしたい場合は、次のことができます。

    CGRect frame = self.tableViewHeader.frame;
    frame.size.height = CGFLOAT_MIN; //not 0
    self.tableView.tableHeaderView.frame = frame;
    self.tableView.tableHeaderView = self.tableViewHeader;

それが役に立てば幸い。

0
coolbeet

Swift3

  If you are using grouped table then do following things .
  This will remove top space.
    var frame = CGRect.zero
    frame.size.height = .leastNormalMagnitude
    self.tableView.tableHeaderView = UIView(frame: frame)
    self.tableView.tableFooterView = UIView(frame: frame)
If you Still getting this issue then it will remove by default content offset from top.
 [Set content insets never]          

https://i.stack.imgur.com/fjxOV.png

0

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

何らかの理由で私のtableviewのcontentOffsetは-20の 'y'を持っていたので、私のtableviewを設定するときに気付きました:Swift 3/4

tableView.contentOffset = .zero

Objective-C

self.tableView.contentOffset = CGPointMake(0, 44);
0
Jason Silver

Swift 4回答...

インターフェイスビューでTable Viewが選択され、属性インスペクターで「グループ化」スタイルが選択されている場合、View Controllerに次のコードを入力して余分なヘッダースペースの問題を修正します。

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return CGFloat.leastNonzeroMagnitude
}
0
F. Morales

Swiftを使うこれを試して:

func tableView(_ tableView: UITableView, viewForHeaderInSection 
section: Int) -> UIView? {
    return nil 
}
0
ali ziwa

iOS 7では、navBarの下ではなく、画面の最初の部分を表示します。それをur navbarの一番下に設定するのは簡単です。解決策は _ this _ answerで確認してください。同じ質問ではありませんが、自分の質問と非常に関連があります。

0
MQoder

答えも回避策も役に立たなかった。ほとんどがtableView自体を扱っていました。私にとって問題の原因は、tableViewまたはcollectionViewを追加するビューでした。これは私のためにそれを修正したものです:

Swift 5

edgesForExtendedLayout = []

それをviewDidLoadに入れると、迷惑なギャップがなくなりました。お役に立てれば。

0
c0d3p03t

それをするもう一つの方法... ... それはどんな高さの値もハードコーディングするのを避けているので私はそれが好きです

UITableViewStyleGroupedテーブル(静的または動的)では、tableView(_:heightForHeaderInSection)に目的の高さを割り当てるだけです。セクションヘッダーラベルの下の余白に基づいて新しい高さを計算しています。

override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

    var height = UITableViewAutomaticDimension

    if section == 0, let header = tableView.headerViewForSection(section) {
        if let label = header.textLabel {
            // get padding below label
            let bottomPadding = header.frame.height - label.frame.Origin.y - label.frame.height
            // use it as top padding
            height = label.frame.height + (2 * bottomPadding)
        }
    }

    return height
}

IOS 9、Xcode 7.3でテスト済み。

それが役に立てば幸い。

0
maganap

このコードは私のために働きました、私にとって最良の答えはobjective-Cの上側に書かれていたので、私はそれをSwiftに変換しました。

Swift 4.0以降の場合

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: 0.01))

これをviewDidLoad()に書くだけで、チャンピオンのように動作します。

0
Vipul Kumar

前の答えのどれも私のために働きませんでした。 Table Viewに動的にヘッダを追加した後のパディングがNavigation BarからDocument Outlineを選択し、Translucentボックスを再チェックすることになっていました(それを半透明にするように強制していると答えているのとは反対) 。赤が少しオレンジ色に見えるため、以前はチェックを外していましたが、Table Viewがこのシーンの唯一の要素であるため、シーンの要素を並べ替えるという解決策を試すことはできませんでした。この解決法はNavigation Barの色の上に半透明の層があることで大丈夫である限り有効です。お役に立てれば :)

0
jeff t

私にとっては、すべての解決策を試してみましたが、UITableViewセクションの高さを設定することを考えていましたが、これはうまくいきました( Swift を使用)。

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

これは私のために働きました。また、セクションに基づいてヘッダーの高さを指定することもできます。

0
vsujan