web-dev-qa-db-ja.com

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

グループ化されたスタイルを使用したテーブルビューのデザインが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を返す場合、それはほぼ正しいです。ただし、シミュレータで「Color Misaligned Images」をオンにすると、すべてのテーブルビューセルがマークされます(これは論理的な結果のようです)。

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

これまでの最善の妥協点は、高さ0.5を返すことです。これにより、ナビゲーションバーの下の線がやや太くなります。ただし、最初のセクションヘッダーを完全に非表示にする方法を知っている人がいれば幸いです。

更新

caglar の分析( https://stackoverflow.com/a/19056823/413337 )によると、テーブルビューがNavigation Controllerに含まれている場合にのみ問題が発生します。

100
Codo

私には合理的にきれいな回避策があります。だから私は自分の質問に答えています。

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

目的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)
}
141
Codo

これは、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
    }
    
46
user3378170

答えは私と私のチームにとって非常に面白かったそして魅力的に働いた

  • Interface Builderで、ビュー階層の別のビューの下にTableViewを移動するだけです。

理由:

これは、ビュー階層の最初のビューでのみ発生します。この最初のビューがUITableViewの場合。したがって、他のすべての同様のUITableViewには、最初のセクションを除き、この迷惑なセクションはありません。ビュー階層の最初の場所からUITableViewを移動してみましたが、すべてが期待どおりに機能していました。

36
Giorgos Ath

グループ化されたタイプtableViewにこのトリックを使用

viewDidLoadメソッドでテーブルビューのコードの下に貼り付けます:

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

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

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 {
        ...
    }
}
18
TonnyTao

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

enter image description here

6
caglar

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
}
5
h.martin

更新[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
}
5

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

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

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

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

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

0
Vilém Kurz

まだコメントできませんが、UISearchControllerUISearchBarであるコントローラー上にtableHeaderViewがある場合、heightForHeaderInSectionの最初のセクションの高さを0に設定すると、実際に機能すると思います。

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

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

0
Raesu

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

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

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