Thay đổi kích thước phông chữ cho tiêu đề phần UITableView


138

Ai đó có thể vui lòng hướng dẫn tôi cách dễ nhất để thay đổi kích thước phông chữ cho văn bản trong tiêu đề của phần UITableView không?

Tôi có các phần tiêu đề được thực hiện bằng phương pháp sau:

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

Sau đó, tôi hiểu cách thay đổi thành công chiều cao tiêu đề của phần bằng phương pháp này:

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

Tôi có các ô UITableView được điền bằng phương thức này:

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

Tuy nhiên, tôi bị mắc kẹt làm thế nào để thực sự tăng kích thước phông chữ - hoặc cho vấn đề đó là kiểu phông chữ - của văn bản tiêu đề phần?

Ai đó có thể vui lòng giúp đỡ? Cảm ơn.


1
Phiên bản Swift
Juan Boero

Câu trả lời:


118

Thật không may, bạn có thể phải ghi đè lên điều này:

Trong Mục tiêu-C:

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

Trong Swift:

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

Hãy thử một cái gì đó như thế này:

Trong Mục tiêu-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;
}

Trong 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
Cảm ơn bạn. Điều này làm việc hoàn hảo. Nhiều đánh giá cao.
JRD8

5
Trong khi đây là một giải pháp chính xác, hãy cẩn thận với phương pháp này. Đối với một tiêu đề dài hơn một dòng, bạn sẽ phải thực hiện các tính toán về chiều cao của tiêu đề tableView:heightForHeaderInSection:có thể rất cồng kềnh.
Leo Natan

3
Đã thử điều này và trong khi nó hoạt động nếu bạn cuộn bảng lên, Nhãn Tiêu đề vẫn ở trên màn hình và phủ lên các ô. :(
Plasma

2
@trss Tôi nghĩ bạn sẽ thấy đây không phải là hành vi mong đợi. Tôi không nói về phần tiêu đề ở đó, chỉ có nhãn và siêu áp đặt của nó lên các ô khi chúng đi qua nó làm cho nó trông như một mớ hỗn độn thực sự. Tôi đã tìm thấy một cách tốt hơn để đạt được điều này và sẽ đăng lại khi tôi tìm thấy nó một lần nữa.
Plasma

1
@ mosca1337 không cần tạo chế độ xem khác, bạn có thể nhận được 'UITableViewHeaderFooterView' thực tế đang được hiển thị và điều chỉnh các tham số.
Juan Boero 7/07/2016

367

Một cách khác để làm điều này sẽ là đáp ứng với UITableViewDelegatephương pháp willDisplayHeaderView. Quan điểm đã thông qua thực sự là một ví dụ của a UITableViewHeaderFooterView.

Ví dụ dưới đây thay đổi phông chữ và cũng căn giữa văn bản tiêu đề theo chiều dọc và chiều ngang trong ô. Lưu ý rằng bạn cũng nên phản hồi để heightForHeaderInSectioncó bất kỳ thay đổi nào đối với chiều cao của người đứng đầu của bạn được tính trong bố cục của chế độ xem bảng. (Đó là, nếu bạn quyết định thay đổi chiều cao tiêu đề trong willDisplayHeaderViewphương pháp này .)

Sau đó, bạn có thể trả lời titleForHeaderInSectionphương thức để sử dụng lại tiêu đề được định cấu hình này với các tiêu đề phần khác nhau.

Mục tiêu-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

(Lưu ý: nếu trình điều khiển xem của bạn là hậu duệ của a UITableViewController, thì điều này cần phải được khai báo là 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

Mã này cũng đảm bảo rằng ứng dụng không gặp sự cố nếu chế độ xem tiêu đề của bạn không phải là 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
Phương pháp này hiệu quả với tôi hơn nhiều so với phương pháp trên
Plasma

6
Câu trả lời hay nhất tôi đã thấy.
phatmann

2
Đây sẽ là cách "thích hợp" để điều chỉnh thông tin, giả sử không có lý do nào khác để phân lớp (chẳng hạn như thêm chế độ xem). Ngoài ra, phương pháp này có thể được sử dụng để cập nhật văn bản tiêu đề cho Kiểu động. Chỉ cần sử dụng: header.textLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];và / hoặc header.detailTextLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];cùng với các bước khác cần thiết (xem tại đây: captechconsulting.com/blog/john-szumski/ mẹo )
leanne

3
Điều này không thay đổi kích thước chế độ xem tiêu đề, vì vậy nếu phông chữ của bạn lớn hơn hoặc khác biệt đáng kể, chẳng hạn như Zapfino (đừng hỏi tại sao), nó sẽ cắt văn bản ra. Nếu bạn phải tự tính toán kích thước, đó là một mớ hỗn độn và bạn không nên làm điều đó.
Leo Natan

@CocoaPriest Không bị lỗi trong phiên bản beta của tôi, tho. (Hạt giống GM 2)
Patrick Bassut

96

Trong khi câu trả lời của mosca1337 là một giải pháp chính xác, hãy cẩn thận với phương pháp đó. Đối với một tiêu đề có văn bản dài hơn một dòng, bạn sẽ phải thực hiện các tính toán về chiều cao của tiêu đề tableView:heightForHeaderInSection:có thể rườm rà.

Một phương pháp được ưa thích hơn là sử dụng API xuất hiện:

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

Điều này sẽ thay đổi phông chữ, trong khi vẫn rời khỏi bảng để tự quản lý độ cao.

Để có kết quả tối ưu, hãy phân lớp chế độ xem bảng và thêm nó vào chuỗi ngăn chặn (in appearanceWhenContainedIn:) để đảm bảo phông chữ chỉ được thay đổi cho các chế độ xem bảng cụ thể.


1
Nếu phân lớp thì dù sao bạn cũng sẽ trả về một chế độ xem tùy chỉnh - tableView:viewForHeaderInSection:phải không? Trong trường hợp đó, phông chữ có thể được đặt ngay tại đó. Đây là những gì giải pháp của @ mosca1337 vẫn làm.
trss

1
Haha, tôi là một woozey sau ngày hôm qua. Phân lớp khung nhìn bảng và thêm nó vào danh sách container. ;-)
Leo Natan

2
Giải pháp này gây ra nhiều lỗi khi tính toán kích thước chân trang / tiêu đề thực. Tôi có thể hiển thị một số ví dụ khi tiêu đề bị cắt trong khi phông chữ tùy chỉnh được thiết lập.
kas-kad

5
Swift 3 :UILabel.appearance(whenContainedInInstancesOf: [UITableViewHeaderFooterView.self]).font = UIFont.boldSystemFont(ofSize: 28)
Eric Hodgins

3
Điều này không thay đổi kích thước nhãn chính xác để phù hợp với phông chữ trên iOS 11. Ngoài ra, cuộn lên và xuống sau khi tải các chế độ xem đặt lại chúng thành phông chữ mặc định.
nickdnk

25

Đối với iOS 7 tôi sử dụng cái này,


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

Đây là phiên bản Swift 3.0 với thay đổi kích thước tiêu đề

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
Điều này sẽ không kích thước chế độ xem tiêu đề để phù hợp với phông chữ mới.
Leo Natan

@LeoNatan Làm thế nào chúng ta có thể kích thước chế độ xem tiêu đề để phù hợp với phông chữ mới - có thể được thực hiện trong phương pháp này không?
SAHM

Tôi muốn làm rõ rằng tôi đã thấy câu trả lời ở trên của bạn nhưng tôi chỉ muốn thay đổi phông chữ để giới hạn kích thước khi người dùng chọn phông chữ (khả năng truy cập) vượt quá một kích thước nhất định (vì vậy, không phải lúc nào cũng vậy). Tôi tin rằng tôi cần kiểm tra và có thể thay đổi phông chữ trong willDisplayHeaderView, vậy có cách nào để tôi có thể tính lại chiều cao của chế độ xem nếu phông chữ bị thay đổi không?
SAHM

19

Swift 3:

Cách đơn giản nhất để chỉ điều chỉnh kích thước:

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

Đó là cách dễ nhất mà tôi đang tìm kiếm.
Ryan

Hoạt động trong 4 nhanh chóng! Đừng quên "ghi đè func .."
Matvey

8

Swift 2.0 :

  1. Thay thế tiêu đề phần mặc định bằng UILabel hoàn toàn tùy chỉnh.

Triển khai viewForHeaderInSection, như vậy:

  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. Thay đổi tiêu đề mặc định (giữ lại mặc định).

Triển khai willDisplayHeaderView, như vậy:

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

Hãy nhớ rằng: Nếu bạn đang sử dụng các ô tĩnh, tiêu đề phần đầu tiên được đệm cao hơn các tiêu đề phần khác do phần trên của UITableView; để sửa lỗi này:

Triển khai heightForHeaderInSection, như vậy:

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

    return 30.0 // Or whatever height you want!
  }

4

Phiên bản Swift 4 của Leo Natan trả lời

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

Nếu bạn muốn đặt một phông chữ tùy chỉnh, bạn có thể sử dụng

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

Thật không may thay đổi kích thước khung hình.
nickdnk

3

Với phương pháp này, bạn có thể đặt kích thước phông chữ, kiểu phông chữ và nền Tiêu đề . có 2 phương pháp cho việc này

Phương pháp đầu tiên

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

Phương pháp thứ hai

- (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

Swift 2:

Như OP đã yêu cầu, chỉ điều chỉnh kích thước, không đặt nó làm phông chữ đậm cho hệ thống hoặc bất cứ điều gì:

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

Đây là giải pháp của tôi với swift 5.

Để kiểm soát hoàn toàn chế độ xem phần tiêu đề, bạn cần sử dụng phương thức tableView (: viewForHeaderInsection: :) trong bộ điều khiển của bạn, như bài viết trước đã trình bày. Tuy nhiên, có một bước nữa: để cải thiện hiệu suất, apple khuyên bạn không nên tạo chế độ xem mới mỗi lần mà sử dụng lại chế độ xem tiêu đề, giống như sử dụng lại ô bảng. Điều này là theo phương thức tableView.dequeueReabilitiesHeaderFooterView (withIdentifier :). Nhưng vấn đề tôi gặp phải là một khi bạn bắt đầu sử dụng chức năng sử dụng lại này, phông chữ sẽ không hoạt động như mong đợi. Những thứ khác như màu sắc, căn chỉnh tất cả tốt nhưng chỉ cần phông chữ. Có một số cuộc thảo luận nhưng tôi đã làm cho nó hoạt động như sau.

Vấn đề là tableView.dequeueReabilitiesHeaderFooterView (withIdentifier :) không giống như tableView.dequeneReuseCell (:) luôn trả về một ô. Các cựu sẽ trả lại một con số không nếu không có sẵn. Ngay cả khi nó trả về một chế độ xem tiêu đề sử dụng lại, nó không phải là loại lớp ban đầu của bạn, mà là một UITableHeaderFooterView. Vì vậy, bạn cần phải thực hiện phán đoán và hành động theo mã của riêng bạn. Về cơ bản, nếu không, hãy xem một tiêu đề hoàn toàn mới. Nếu không bằng không, buộc phải đúc để bạn có thể kiểm soát.

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}

    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.