更改UITableView节标题的字体大小

时间:2013-11-06 01:22:26

标签: ios objective-c swift uitableview uitableviewsectionheader

有人可以告诉我最简单的方法来更改UITableView部分标题中文本的字体大小吗?

我使用以下方法实现了部分标题:

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

然后,我了解如何使用此方法成功更改节标题高度:

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

我使用此方法填充了UITableView单元格:

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

但是,我不知道如何实际增加部分标题文本的字体大小 - 或者字体样式?

有人可以帮忙吗?感谢。

11 个答案:

答案 0 :(得分:343)

另一种方法是回复UITableViewDelegate方法willDisplayHeaderView。传递的视图实际上是UITableViewHeaderFooterView的实例。

下面的示例更改了字体,并且还在单元格中垂直和水平居中标题文本。请注意,您还应该回复heightForHeaderInSection,以便在表格视图的布局中对标题的高度进行任何更改。 (也就是说,如果您决定使用此willDisplayHeaderView方法更改标题高度。)

然后,您可以响应titleForHeaderInSection方法,将此配置的标头重用为不同的标题。

<强>目标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
}

答案 1 :(得分:109)

不幸的是,你可能不得不重写:

在Objective-C中:

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

在斯威夫特:

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

在斯威夫特:

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
}

答案 2 :(得分:92)

虽然mosca1337的答案是正确的解决方案,但要小心这种方法。对于文本长于一行的标题,您必须在tableView:heightForHeaderInSection:中执行标题高度的计算,这可能很麻烦。

一种更受欢迎的方法是使用外观API:

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

这将改变字体,同时仍然离开桌子来管理高度本身。

为了获得最佳结果,请将表视图子类化,并将其添加到包含链(appearanceWhenContainedIn:)中,以确保仅针对特定表视图更改字体。

答案 3 :(得分:23)

对于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          
    }
}

答案 4 :(得分:15)

斯威夫特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)
    }
}

答案 5 :(得分:8)

Swift 2.0

  1. 使用完全可自定义的UILabel替换默认部分标题。
  2. 实现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. 更改默认标头(保留默认值)。
    2. 实现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!
        }
      

答案 6 :(得分: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;
}

答案 7 :(得分:2)

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

答案 8 :(得分:2)

在这里,您必须按照此处编写一些方法。 #Swift 5

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    
    let header = view as? UITableViewHeaderFooterView
    header?.textLabel?.font = UIFont.init(name: "Montserrat-Regular", size: 14)
    header?.textLabel?.textColor = .greyishBrown
}

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

祝你好运

答案 9 :(得分:1)

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

答案 10 :(得分:0)

这是我的快速解决方案5。

要完全控制标题节视图,您需要在控制器中使用tableView(:viewForHeaderInsection::)方法,如前一篇文章所示。但是,还有一个步骤:为了提高性能,Apple建议不要每次都生成一个新视图,而是像重用表单元格一样重新使用头视图。这是通过tableView.dequeueReusableHeaderFooterView(withIdentifier:)方法实现的。但是我遇到的问题是,一旦您开始使用此重用功能,字体将无法按预期运行。其他诸如颜色,对齐方式等都很好,但只是字体。有一些讨论,但是我使它像下面那样工作。

问题是tableView.dequeueReusableHeaderFooterView(withIdentifier :)与tableView.dequeneReuseCell(:)不同,后者总是返回一个单元格。如果没有人,前者将返回nil。即使返回一个重用头视图,它也不是您原来的类类型,而是一个UITableHeaderFooterView。因此,您需要做出判断并按照自己的代码行事。基本上,如果为零,则获得一个全新的标题视图。如果不是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}

    }