115

グループ化されたスタイルを使用したテーブル ビューのデザインが 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」をオンにすると、すべてのテーブル ビュー セルがマークされます (これは論理的な結果のようです)。

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

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

アップデート

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

4

16 に答える 16

158

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

最初のセクション ヘッダーの高さが 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)
}
于 2013-09-27T19:41:07.270 に答える
54

これは、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
    }
    
于 2016-12-05T12:41:57.603 に答える
25

グループ化されたタイプのtableViewにはこのトリックを使用してください

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

tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, tableView.bounds.size.width, 0.01f)];
于 2015-04-30T13:47:17.703 に答える
22

この方法でOKです。

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 {
        ...
    }
}
于 2015-03-31T02:23:01.417 に答える
6

私はあなたのコードをコピーして試しました。正常に動作します(シミュレーターで試しました)。結果ビューを添付しました。そんな景色が欲しいですよね?それとも私はあなたの問題を誤解しましたか?

ここに画像の説明を入力

于 2013-09-27T17:36:53.957 に答える
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
}
于 2017-07-30T13:06:44.050 に答える
5

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

tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: CGFloat.leastNormalMagnitude))
于 2018-07-02T16:42:32.457 に答える
3

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

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

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}
于 2019-05-22T07:19:18.150 に答える
0

UISearchControllerまだコメントすることはできませんが、コントローラーにを持っている場合、最初のセクションの高さを 0 に設定すると実際に機能することを追加したいと思いUISearchBarます。tableHeaderViewheightForHeaderInSection

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

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

于 2015-10-15T22:25:55.697 に答える
0

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

于 2017-08-07T15:14:57.430 に答える