UITableView(グループ化されたスタイル)で最初のセクションヘッダーを非表示にする方法


108

グループ化されたスタイルを使用するテーブルビューのデザインはiOS 7で大幅に変更されたため、最初のセクションヘッダーを非表示(または削除)したいと思います。これまでのところ、なんとか達成できていません。

やや簡略化した私のコードは次のようになります。

- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    if (section == 0)
        return 0.0f;
    return 32.0f;
}

- (UIView*) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    if (section == 0) {
        UIView* view = [[UIView alloc] initWithFrame: CGRectMake(0.0f, 0.0f, 640.0f, 0.0f)];
        return view;
    }
    return nil;
}

- (NSString*) tableView:(UITableView *) tableView titleForHeaderInSection:(NSInteger)section
{
    if (section == 0) {
        return nil;
    } else {
        // return some string here ...
    }
}

高さ0を返すと、他の2つのメソッドがセクションインデックス0で呼び出されることはありません。それでも、空のセクションヘッダーはデフォルトの高さで描画されます。(iOS 6では、2つのメソッドが呼び出されます。ただし、表示される結果は同じです。)

別の値を返すと、セクションヘッダーは指定された高さになります。

0.01を返すと、ほぼ正しいです。ただし、シミュレータで「色がずれる画像」をオンにすると、すべてのテーブルビューセルがマークされます(これは論理的な結果のようです)。

質問UITableView:ヘッダーを空のセクションから非表示にするへの回答は、一部のユーザーがセクションヘッダーを非表示に成功したことを示しているようです。ただし、(グループ化されたスタイルではなく)プレーンスタイルに適用される場合があります。

これまでの最適な妥協点は、高さ0.5を返すことです。その結果、ナビゲーションバーの下のラインがやや太くなります。ただし、誰かが最初のセクションヘッダーを完全に非表示にする方法を知っているとありがたいです。

更新

caglarの分析(https://stackoverflow.com/a/19056823/413337)によると、この問題は、テーブルビューがナビゲーションコントローラーに含まれている場合にのみ発生します。


その部分を取得できませんでした=> if(section == 0)戻りビュー。nilを返します。つまり、最初のセクションの場合はビューを返し、それ以外の場合はnilを返しますか?

最初のセクションでは高さ0のビューを返し、他のすべてのセクションではnilを返すので、テーブルビューはデフォルトのヘッダービューを使用します。nilの部分がうまく動作します。テーブルビューには、これらのセクションのヘッダーが表示されます。ただし、メソッドはで呼び出されないため、セクション0の部分は無関係section == 0です。
Codo 2013

1
この答えは短くて甘いようです。stackoverflow.com/a/23955420/3965
Rogers氏、

回答:


154

私にはかなりクリーンな回避策があります。だから私は自分の質問に答えています。

最初のセクションヘッダーの高さとして0が機能しないため、1を返します。次に、contentInsetを使用して、ナビゲーションバーの下のその高さを非表示にします。

Objective-C:

- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    if (section == 0)
            return 1.0f;
    return 32.0f;
}

- (NSString*) tableView:(UITableView *) tableView titleForHeaderInSection:(NSInteger)section
{
    if (section == 0) {
        return nil;
    } else {
        // return some string here ...
    }
}

- (void) viewDidLoad
{
    [super viewDidLoad];

     self.tableView.contentInset = UIEdgeInsetsMake(-1.0f, 0.0f, 0.0f, 0.0);
}

迅速:

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return section == 0 ? 1.0 : 32
}

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.contentInset = UIEdgeInsets(top: -1, left: 0, bottom: 0, right: 0)
}

6
ヘッダーの高さを0.1fにすると、非表示にできます。
Chuck Krutsinger

4
0.1fを使ってみました。しかし、その結果、描画がピクセルに揃わなくなり、ぼやけが発生し、パフォーマンスが低下します。シミュレータで試してみてください。問題のある配置を強調表示するオプションがあります。
Codo 2013年

31
実際CGFLOAT_MINには、ハードコーディングされた値の代わりに使用することをお勧めします(将来的に壊れる可能性は低くなります)。言い換えると、そうではなくreturn 1.0f0.1f代わりに、return CGFLOAT_MINAppleが最小許容値を変更した場合、戻り値をハードコードすると、変更するコードができます。また、可能な限り最小の値を使用しているかどうかは、すでにわかりません。定義された定数を使用すると、可能な限り最小の値を使用することが保証され、コードはOSの変更後も存続します。
クリスオストモ2014

11
@クリス:よくわからないな。非常に小さい値は返しませんが、ピクセルのサイズの倍数を返すので、描画はピクセルの整列を維持します(優れたパフォーマンスと鮮明さのため)。次に、コンテンツインセットを使用してオフセットします。これはかなりの目に見える距離であり、OSが無視できるものではないため、将来変更される可能性はほとんどありません。
Codo 2014

8
+1分数のピクセル値をUIオフセットとして使用しない場合。
Ricardo Sanchez-Saez 2014年

52

これは、UITableView(グループ化されたスタイル)の最初のセクションヘッダーを非表示にする方法です。

Swift 3.0およびXcode 8.0ソリューション

  1. TableViewのデリゲートは、heightForHeaderInSectionメソッドを実装する必要があります

  2. heightForHeaderInSectionメソッド内で、最小の正の数を返します。(ゼロではありません!)

    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    
        let headerHeight: CGFloat
    
        switch section {
        case 0:
            // hide the header
            headerHeight = CGFloat.leastNonzeroMagnitude
        default:
            headerHeight = 21
        }
    
        return headerHeight
    }

6
0ではなくCGFloat.leastNonzeroMagnitudeを返すと役に立ちました。ありがとう!
anoo_radha

完璧な答え、ありがとう
ピエール

ところで、CGFLOAT_MINのためにObjCと同一であるCGFloat.leastNonzeroMagnitudeスウィフト
DawnSong

36

答えは私と私のチームにとって非常に面白く、魅力のように働きました

  • インターフェイスビルダーで、テーブル階層をビュー階層の別のビューの下に移動するだけです。

理由:

私たちはすることが観察され、この最初のビューでのUITableViewであれば、これは、唯一のビュー階層での最初のビューのために起こります。したがって、他のすべての同様のUITableViewには、最初のセクションを除いて、この厄介なセクションはありません。UITableViewをビュー階層の最初の場所から移動してみましたが、すべてが期待どおりに機能していました。


1
テーブルビューをスクロールしても、ナビゲーションバーの曇りガラス効果はありますか?
Codo

tableViewを適切に設定すると、このぼかし効果が得られます。contentInsetたとえば{0, 64, 0, 0}、上から64pxオフセットするようにを設定する必要があります(ステータスバーとナビゲーションバー)。tableViewは、topLayoutGuideではなく画面上部にアタッチする必要があります(ナビゲーションバーの下に到達させるため)
Julian F. Weinert

プルを使用してリフレッシュしていない場合は、これで問題ありません。
マイケル

2
ワオ。これは私にとってiOS 9で機能し、ちょうど私の心を吹き飛ばしました。
割り当て

これは受け入れられる答えになるはずです。このような奇妙なバグ!
Oded Harth 2016年

25

グループ化された型tableViewにこのトリックを使用します

以下のコードをコピーして、viewDidLoadメソッドのテーブルビューのコードを貼り付けます。

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

私は試していませんが、このソリューションには他の提案されたソリューションのいくつかと同じ欠点があると思います。図面がピクセルに揃わなくなり、ぼやけが発生し、パフォーマンスが低下します。シミュレーターはそれを明らかにできます。問題のある配置を強調表示するオプションがあります。しかし、それが0に切り捨てられる場合、それは確かに素晴らしい解決策です。
Codo

はい、私はそれが0に切り捨てられると思います。私はそれを何度も使用したので、図面にぼけは見つかりませんでした。
Nitesh Borad

TableHeaderViewとセクションヘッダービュー?違いは何
ですか

または少し短い:_tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 1)]
mojuba 2017

@AsifHabib:tableHeaderViewはすべてのテーブル要素の上に配置されます。テーブル自体のヘッダービューです。そしてセクションヘッダービューは各セクションに配置されるビューです。テーブル内の指定されたセクション数に応じて、多くのセクションヘッダービューが存在する可能性があります。ただし、テーブルヘッダービューは1つだけです。
Nitesh Borad 2017

21

この方法で問題ありません。

override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    if section == 0 {
        return CGFloat.min
    }
    return 25
}

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    if section == 0 {
        return nil
    }else {
        ...
    }
}

2
これは、小数値を使用することを除いて、私のソリューションの素晴らしいバリエーションです。これにより、テキストと画像がピクセルに揃わなくなり、描画が遅くなり、結果がぼやける可能性があります。シミュレータには、この問題を明らかにするための「色ずれ画像」オプションがあります。
Codo 2015年


3
Swift 3> 'CGFloat.min'は 'CGFloat.leastNormalMagnitude'に名前が変更されました
rjobidon

6

コードをコピーして試してみました。それは正常に実行されます(シミュレーターで試行されました)。結果ビューを添付しました。あなたはそのような見方をしたいですよね?または私はあなたの問題を誤解しましたか?

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


1
はい、それは基本的に私が望んでいることですが、テーブルビューがナビゲーションコントローラー内にある点が異なります。それで違いはありますか?
Codo 2013

2
ナビゲーションコントローラーにtableViewを追加しましたが、状況が表示されます:) iOS 7では、グループ化されたスタイルのテーブルビューで、このヘッダーの高さがデフォルトで修正されます。tableViewのフレームを変更すると、最初のヘッダービューが非表示になる場合があります(set x = 0 y = -40など)。しかし、私はこの解決策が良い解決策ではないことを知っています。
caglar 2013

1
本当にありがとうございました。したがって、問題が発生するのは、テーブルビューがグループ化されたスタイルを使用し、ナビゲーションコントローラ内に含まれている場合のみです。
Codo 2013

ビューコントローラーからテーブルビューコントローラーに変更しようとすると、ヘッダーの問題を修正できませんでした。多分私はそれを変換しようとしている何かが欠けています。(iOS 7.0.3 sim)
Evgeni Petrov

1
この問題はこのスナップショットにも表示されます!0番目のセルがx:0.0f&y:0.0fから始まっていません。
Burhanuddin Sunelwala 14

6

Swift3:heightForHeaderInSectionは0で機能します。ヘッダーがclipsToBoundsに設定されていることを確認するだけです。

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

clipsToBoundsを設定しない場合、スクロール時に非表示のヘッダーが表示されます。

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    guard let header = view as? UITableViewHeaderFooterView else { return }

    header.clipsToBounds = true
}

1
セクションヘッダービューを完全に非表示にする場合は、clipsToBound = trueが非常に重要です。高さを0 / CGFLOAT_MINに設定するだけでは不十分です。
Altimac

5

アップデート[9/19/17]:iOS 11では以前の回答が機能しなくなりました。Appleに感謝します。次のことを行いました:

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 20.0f;
self.tableView.contentInset = UIEdgeInsetsMake(-18.0, 0.0f, 0.0f, 0.0);

以前の回答:

Chris Ostomoのコメントに投稿されているように、次のことがうまくいきました。

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return CGFLOAT_MIN; // to get rid of empty section header
}

テーブルビューのコンテンツがピクセルに揃っていないため、ぼやけが発生し、パフォーマンスが低下しているようです。シミュレーターはそれを明らかにできます。問題のある配置を強調表示するオプションがあります。しかし、それが0に切り捨てられる場合、それは確かに素晴らしい解決策です。
Codo

いいえ、コンテンツの問題に気づきませんでした。制約は問題ないように見えました。
Manindra Moharana 2017

1
ああ!iOS 11では動作しなくなりました。私の修正は少ない週間以上続いた...😞
Manindra Moharana

4

Swiftでグループ化されたUITableViewの上部セクションヘッダーを削除する方法は次のとおりです。

tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: CGFloat.leastNormalMagnitude))

3

Swift 4.2以前の多くのバージョンでは、他の回答のように最初のヘッダーの高さを0に設定する代わりに、他のヘッダーをに設定するだけで済みますnil。2つのセクションがあり、2番目のセクション(つまり1)だけにヘッダーを付けたいとします。そのヘッダーには、テキストFoobarが含まれます。

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return section == 1 ? "Foobar" : nil
}

3

すべてのセクションヘッダーを完全に削除する場合は、これを試してください

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

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

それだけが必要です。シンプルで簡単なソリューション。1+
iGhost

0

まだコメントはできませんがUISearchController、コントローラUISearchBarとしてをとして使用しているtableHeaderView場合、最初のセクションの高さを0に設定するとheightForHeaderInSection実際に機能します。

self.tableView.contentOffset = CGPointMake(0, self.searchController.searchBar.frame.size.height);検索バーがデフォルトで非表示になるように使用しています。

その結果、最初のセクションにはヘッダーがなく、下にスクロールすると、最初の行のすぐ上に検索バーが表示されます。


0

最も簡単なのは、を返すnil""func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String?ヘッダーを表示したくないセクションに移動することです。


0

Swiftバージョン:Swift 5.1
ほとんどの場合、次のようにtableViewデリゲートで高さを設定できます。

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
   return UIView(frame: CGRect(x: 0, y: 0, width: view.width, height: CGFloat.leastNormalMagnitude))
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
   return CGFloat.leastNormalMagnitude
}

XibまたはStoryboardでUITableViewを作成したときに、upの答えが機能しない場合があります。あなたは2番目の解決策を試すことができます:

let headerView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: CGFloat.leastNormalMagnitude))
self.tableView.tableHeaderView = headerView

それがあなたのために働くことを願っています!

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