web-dev-qa-db-ja.com

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

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

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

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

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

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

このメソッドを使用してUITableViewセルにデータを入力しました:

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

しかし、私は実際にセクションヘッダーテキストのフォントサイズを増やす方法について固執していますか?それともフォントスタイルですか?

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

125
JRD8

残念ながら、これをオーバーライドする必要がある場合があります。

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
}
109
mosca1337

これを行う別の方法は、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

(注:View Controllerが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.

また、このコードは、ヘッダービューが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
}
345
Mark Semsel

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

最も好ましい方法は、外観APIを使用することです。

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

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

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

92
Leo Natan

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.ヘッダーのサイズ変更を伴うバージョン

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          
    }
}
23
Maria

Swift 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)
    }
}
16
jeff-ziligy

Swift 2.

  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!
  }
8
Elliott Davies

この方法では、フォントサイズ、フォントスタイル、ヘッダーの背景も設定できます。これには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]];
    }

2番目の方法

- (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;
}
3
Anup Gupta

Swift 4バージョンのLeo Natan answer

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
}
2
Giorgio

Swift 2:

OPが尋ねたように、onlyサイズを調整し、システムの太字フォントなどに設定しません:

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)
        }
    }
1
Juan Boero