UITableViewセクションヘッダーのフォントサイズの変更


138

誰かがUITableViewセクションヘッダーのテキストのフォントサイズを変更する最も簡単な方法を教えてもらえますか?

次の方法を使用してセクションタイトルを実装しています。

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section

次に、この方法を使用してセクションヘッダーの高さを変更する方法を理解しました。

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section

このメソッドを使用して、UITableViewセルにデータを入力しています。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

しかし、セクションヘッダーテキストのフォントサイズを実際に大きくする方法、つまりフォントスタイルをどうするかについて、私は行き詰まっていますか?

誰かが助けてくれますか?ありがとう。


1
Swiftバージョン
Juan Boero

回答:


118

残念ながら、これを上書きする必要があるかもしれません:

Objective-Cの場合:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

Swiftの場合:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?

次のようなものを試してください:

Objective-Cの場合:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {

    UILabel *myLabel = [[UILabel alloc] init];
    myLabel.frame = CGRectMake(20, 8, 320, 20);
    myLabel.font = [UIFont boldSystemFontOfSize:18];
    myLabel.text = [self tableView:tableView titleForHeaderInSection:section];

    UIView *headerView = [[UIView alloc] init];
    [headerView addSubview:myLabel];

    return headerView;
}

Swiftの場合:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let myLabel = UILabel()
    myLabel.frame = CGRect(x: 20, y: 8, width: 320, height: 20)
    myLabel.font = UIFont.boldSystemFont(ofSize: 18)
    myLabel.text = self.tableView(tableView, titleForHeaderInSection: section)

    let headerView = UIView()
    headerView.addSubview(myLabel)

    return headerView
}

1
ありがとうございました。これは完全に機能しました。とても有難い。
JRD8 2013年

5
これは正しい解決策ですが、この方法には注意してください。ヘッダーが1行より長い場合は、ヘッダーの高さの計算を実行する必要がありますtableView:heightForHeaderInSection:
レオナタン2014年

3
これを試してみましたが、テーブルを上にスクロールすると機能しますが、ヘッダーラベルは画面に残り、セルをオーバーレイします。:(
プラズマ14

2
@trssこれは予期された動作ではないことに気付くと思います。私はそこにとどまっているヘッダーセクション、ラベルだけ、およびそれが本当の混乱に見えるようにその下を通過するときにセルに重ねられていることについて話しているのではありません。私はこれを達成するためのより良い方法を見つけました、そしてそれを再び見つけたらそれを投稿します。
プラズマ

1
@ mosca1337別のビューを作成する必要はありません。実際に表示されている「UITableViewHeaderFooterView」を取得して、パラメータを調整できます。
Juan Boero 16

367

これを行う別の方法は、UITableViewDelegateメソッドに応答することですwillDisplayHeaderView。渡されたビューは実際にはのインスタンスですUITableViewHeaderFooterView

次の例では、フォントを変更し、タイトルテキストをセル内で垂直方向および水平方向に中央揃えにします。heightForHeaderInSectionテーブルビューのレイアウトで考慮されるヘッダーの高さの変更がある場合にも応答する必要があることに注意してください。(つまり、このwillDisplayHeaderViewメソッドでヘッダーの高さを変更する場合。)

次に、titleForHeaderInSectionメソッドに応答して、この構成済みヘッダーをさまざまなセクションタイトルで再利用できます。

Objective-C

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
    UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view;

    header.textLabel.textColor = [UIColor redColor];
    header.textLabel.font = [UIFont boldSystemFontOfSize:18];
    CGRect headerFrame = header.frame;
    header.textLabel.frame = headerFrame;
    header.textLabel.textAlignment = NSTextAlignmentCenter;
}

Swift 1.2

(注:ビューコントローラがの子孫であるUITableViewController場合、これはとして宣言する必要がありoverride funcます。)

override func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) 
{
    let header:UITableViewHeaderFooterView = view as! UITableViewHeaderFooterView

    header.textLabel.textColor = UIColor.redColor()
    header.textLabel.font = UIFont.boldSystemFontOfSize(18)
    header.textLabel.frame = header.frame
    header.textLabel.textAlignment = NSTextAlignment.Center
}

Swift 3.0

このコードは、ヘッダービューがUITableViewHeaderFooterView以外の場合でもアプリがクラッシュしないようにします。

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    guard let header = view as? UITableViewHeaderFooterView else { return }
    header.textLabel?.textColor = UIColor.red
    header.textLabel?.font = UIFont.boldSystemFont(ofSize: 18)
    header.textLabel?.frame = header.frame
    header.textLabel?.textAlignment = .center
}

3
この方法は、上記のものよりも、私にとってははるかに良い仕事を
プラズマ

6
私が見た最良の答え。
ファットマン2014年

2
これは、サブクラス化する他の理由がない場合(ビューの追加など)を想定して、情報を調整する「適切な」方法です。さらに、このメソッドを使用して、動的タイプのヘッダーテキストを更新できます。単に使用する:header.textLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];および/またはheader.detailTextLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];必要な他のステップと一緒に(ここを参照:captechconsulting.com/blog/john-szumski/…
14:39にリーン

3
これはヘッダービューのサイズを変更しないので、フォントが大きいか、Zapfino(理由は問わない)などの大幅に異なるフォントの場合、テキストが切り取られます。自分でサイズを計算する必要がある場合、それは混乱しているので、行うべきではありません。
レオナタン2014年

@CocoaPriest私のベータ版ではクラッシュしません。(GMシード2)
Patrick Bassut 2014年

96

mosca1337の答えは正しい解決策ですが、その方法には注意してください。1行より長いテキストを含むヘッダーの場合、tableView:heightForHeaderInSection:煩わしいヘッダーの高さの計算を実行する必要があります。

より望ましい方法は、外観APIを使用することです。

[[UILabel appearanceWhenContainedIn:[UITableViewHeaderFooterView class], nil] setFont:[UIFont boldSystemFontOfSize:28]];

これによりフォントが変更されますが、高さ自体を管理するためのテーブルは残ります。

最適な結果を得るには、テーブルビューをサブクラス化し、それを包含チェーン(内appearanceWhenContainedIn:)に追加して、特定のテーブルビューに対してのみフォントが変更されるようにします。


1
サブクラス化する場合は、とにかく- tableView:viewForHeaderInSection:右からカスタムビューを返しますか?その場合、フォントをすぐに設定できます。とにかく、これが@ mosca1337のソリューションです。
trss 2014年

1
ははは、昨日はうんざりです。テーブルビューをサブクラス化し、コンテナーリストに追加します。;-)
レオナタン

2
このソリューションは、実際のフッター/ヘッダーサイズの計算で多くのバグを引き起こします。カスタムフォントの設定中にタイトルがカットされる例をいくつか示します。
kas-kad 2014年

5
スウィフト3UILabel.appearance(whenContainedInInstancesOf: [UITableViewHeaderFooterView.self]).font = UIFont.boldSystemFont(ofSize: 28)
エリックホジンス2017

3
これにより、iOS 11のフォントに合わせてラベルのサイズが正しく変更されません。また、ビューを読み込んだ後に上下にスクロールすると、デフォルトのフォントにリセットされます。
nickdnk 2018

25

iOS 7の場合、これを使用します。


-(void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
{
    UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view;

    header.textLabel.font = [UIFont boldSystemFontOfSize:10.0f];
    header.textLabel.textColor = [UIColor orangeColor];
}

これは、ヘッダーのサイズ変更を伴うSwift 3.0バージョンです

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let header = view as? UITableViewHeaderFooterView {
        header.textLabel!.font = UIFont.systemFont(ofSize: 24.0)
        header.textLabel!.textColor = UIColor.orange          
    }
}

6
これは、新しいフォントに合わせてヘッダービューのサイズを変更しません。
レオナタン

@LeoNatan新しいフォントに合わせてヘッダービューのサイズをどのように設定できますか?この方法で行うことができますか?
SAHM

上記の回答が表示されたことを明確にしたかったのですが、ユーザーが選択したフォント(アクセシビリティ)が特定のサイズを超える(常にではない)場合にのみ、フォントを変更してサイズを制限します。willDisplayHeaderViewでフォントを確認し、場合によっては変更する必要があると思います。フォントが変更された場合にビューの高さを再計算する方法はありますか?
SAHM

19

スウィフト3:

サイズのみを調整する最も簡単な方法:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {

    let header = view as! UITableViewHeaderFooterView

    if let textlabel = header.textLabel {
        textlabel.font = textlabel.font.withSize(15)
    }
}

それが私が探している最も簡単な方法です。
ライアン

Swift 4で動作します!「override func ..」を忘れないでください
Matvey

8

Swift 2.0

  1. デフォルトのセクションヘッダーを完全にカスタマイズ可能なUILabelに置き換えます。

次のように、viewForHeaderInSectionを実装します。

  override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let sectionTitle: String = self.tableView(tableView, titleForHeaderInSection: section)!
    if sectionTitle == "" {
      return nil
    }

    let title: UILabel = UILabel()

    title.text = sectionTitle
    title.textColor = UIColor(red: 0.0, green: 0.54, blue: 0.0, alpha: 0.8)
    title.backgroundColor = UIColor.clearColor()
    title.font = UIFont.boldSystemFontOfSize(15)

    return title
  }
  1. デフォルトのヘッダーを変更します(デフォルトのままにします)。

次のようにwillDisplayHeaderViewを実装します。

  override func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {

    if let view = view as? UITableViewHeaderFooterView {
      view.backgroundView?.backgroundColor = UIColor.blueColor()
      view.textLabel!.backgroundColor = UIColor.clearColor()
      view.textLabel!.textColor = UIColor.whiteColor()
      view.textLabel!.font = UIFont.boldSystemFontOfSize(15)
    }
  }

注意:静的セルを使用している場合、UITableViewの上部が原因で、最初のセクションヘッダーは他のセクションヘッダーよりも高く埋め込まれます。これを修正するには:

次のように、heightForHeaderInSectionを実装します。

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

    return 30.0 // Or whatever height you want!
  }

4

レオナタンのSwift 4バージョンの答え

UILabel.appearance(whenContainedInInstancesOf: [UITableViewHeaderFooterView.self]).font = UIFont.boldSystemFont(ofSize: 28)

カスタムフォントを設定したい場合は、

if let font = UIFont(name: "font-name", size: 12) {
    UILabel.appearance(whenContainedInInstancesOf: [UITableViewHeaderFooterView.self]).font = font
}

残念ながら、これはフレームのサイズを変更しません。
nickdnk 2018年

3

この方法では、フォントサイズ、フォントスタイル、ヘッダーの背景も設定できます。これには2つの方法があります

最初の方法

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section{
        UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view;
        header.backgroundView.backgroundColor = [UIColor darkGrayColor];
        header.textLabel.font=[UIFont fontWithName:@"Open Sans-Regular" size:12];
        [header.textLabel setTextColor:[UIColor whiteColor]];
    }

第二の方法

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
    UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 30)];
//    myLabel.frame = CGRectMake(20, 8, 320, 20);
    myLabel.font = [UIFont fontWithName:@"Open Sans-Regular" size:12];
    myLabel.text = [NSString stringWithFormat:@"   %@",[self tableView:FilterSearchTable titleForHeaderInSection:section]];

    myLabel.backgroundColor=[UIColor blueColor];
    myLabel.textColor=[UIColor whiteColor];
    UIView *headerView = [[UIView alloc] init];
    [headerView addSubview:myLabel];
    return headerView;
}

1

スウィフト2:

OPが尋ねたように、サイズを調整するだけで、システムの太字フォントなどには設定しません。

func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
        if let headerView = view as? UITableViewHeaderFooterView, textLabel = headerView.textLabel {

            let newSize = CGFloat(16)
            let fontName = textLabel.font.fontName
            textLabel.font = UIFont(name: fontName, size: newSize)
        }
    }

0

これは迅速な5の私のソリューションです。

ヘッダーセクションビューを完全に制御するには、以前の投稿で示したように、コントローラーでtableView(:viewForHeaderInsection::)メソッドを使用する必要があります。ただし、さらにステップがあります。パフォーマンスを向上させるために、Appleは毎回新しいビューを生成するのではなく、テーブルセルを再利用するのと同じようにヘッダービューを再利用することをお勧めします。これは、メソッドtableView.dequeueReusableHeaderFooterView(withIdentifier:)によるものです。しかし、私が抱えていた問題は、この再利用機能を使い始めると、フォントが期待どおりに機能しなくなることです。色、配置などすべての他の要素は細かいですが、フォントだけです。いくつかの議論がありますが、以下のように動作させるようにしました。

問題は、tableView.dequeueReusableHeaderFooterView(withIdentifier :)が、常にセルを返すtableView.dequeneReuseCell(:)とは異なることです。前者は誰も利用できない場合はnilを返します。再利用ヘッダービューを返す場合でも、それは元のクラス型ではなく、UITableHeaderFooterViewです。したがって、判断を行い、独自のコードに従って行動する必要があります。基本的に、それがnilの場合、新しいヘッダービューを取得します。nilでない場合、強制的にキャストして制御できるようにします。

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let reuse_header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "yourHeaderID")
        if (reuse_header == nil) {
            let new_sec_header = YourTableHeaderViewClass(reuseIdentifier:"yourHeaderID")
            new_section_header.label.text="yourHeaderString"
            //do whatever to set color. alignment, etc to the label view property
            //note: the label property here should be your custom label view. Not the build-in labelView. This way you have total control.
            return new_section_header
        }
        else {
            let new_section_header = reuse_section_header as! yourTableHeaderViewClass
            new_sec_header.label.text="yourHeaderString"
            //do whatever color, alignment, etc to the label property
            return new_sec_header}

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