1. ホーム
  2. ios

[解決済み] UITableView(グループ化スタイル)で最初のセクションのヘッダーを隠す方法

2022-05-17 09:02:47

質問

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: 空のセクションからヘッダーを隠す は、セクションのヘッダを隠すことに成功した人がいることを示しているようです。しかし、それは(グループ化されたものでなく)プレーンなスタイルに適用されるかもしれません。

これまでのところ最良の妥協点は、高さを 0.5 に戻し、ナビゲーション バーの下にやや太い線をもたらすことです。しかし、最初のセクション ヘッダーを完全に隠すことができる方法を知っている人がいれば、感謝します。

更新

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

どのように解決するのですか?

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

最初のセクションヘッダーの高さを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);
}

Swiftです。

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)
}