การเปลี่ยนขนาดตัวอักษรสำหรับส่วนหัวของ UITableView


139

ใครช่วยกรุณาแนะนำฉันเกี่ยวกับวิธีที่ง่ายที่สุดในการเปลี่ยนขนาดตัวอักษรสำหรับข้อความในส่วนหัวของ 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 version
Juan Boero

คำตอบ:


118

น่าเสียดายที่คุณอาจต้องแทนที่สิ่งนี้:

ในวัตถุประสงค์ -C:

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

ในสวิฟต์:

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

ลองสิ่งนี้:

ในวัตถุประสงค์ -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
}

1
ขอบคุณ. มันทำงานได้อย่างสมบูรณ์แบบ ชื่นชมมาก
JRD8

5
ขณะนี้เป็นวิธีแก้ไขปัญหาที่ถูกต้องระวังด้วยวิธีนี้ สำหรับส่วนหัวที่ยาวกว่าหนึ่งบรรทัดคุณจะต้องทำการคำนวณความสูงของส่วนหัวtableView:heightForHeaderInSection:ที่อาจยุ่งยาก
Leo Natan

3
พยายามทำสิ่งนี้และในขณะที่ใช้งานได้หากคุณเลื่อนตารางขึ้นไป Header Label จะยังคงอยู่บนหน้าจอและซ้อนทับเซลล์ต่างๆ :(
พลาสม่า

2
@trss ฉันคิดว่าคุณจะพบว่านี่ไม่ใช่พฤติกรรมที่คาดหวัง ฉันไม่ได้พูดถึงส่วนหัวที่อยู่ที่นั่นมีเพียงฉลากและเซลล์ที่ถูกกำหนดอย่างสุดขีดในขณะที่มันผ่านไปทำให้มันดูยุ่งเหยิงจริง ฉันพบวิธีที่ดีกว่าในการบรรลุเป้าหมายนี้และจะโพสต์กลับเมื่อฉันค้นหาอีกครั้ง
พลาสมา

1
@ mosca1337 ไม่จำเป็นต้องสร้างมุมมองอื่นคุณสามารถรับ 'UITableViewHeaderFooterView' ที่แท้จริงแล้วการแสดงและปรับพารามิเตอร์
Juan Boero

368

วิธีการที่จะทำเช่นนี้อีกก็จะไปตอบสนองต่อวิธีการUITableViewDelegate มุมมองผ่านเป็นจริงตัวอย่างของwillDisplayHeaderViewUITableViewHeaderFooterView

ตัวอย่างด้านล่างเปลี่ยนแบบอักษรและจัดกึ่งกลางข้อความชื่อเรื่องในแนวตั้งและแนวนอนภายในเซลล์ โปรดทราบว่าคุณควรตอบกลับด้วยว่า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;
}

สวิฟท์ 1.2

(หมายเหตุ: หากตัวควบคุมมุมมองของคุณเป็นผู้สืบทอดของ a สิ่ง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
คำตอบที่ดีที่สุดที่ฉันเคยเห็น
phatmann

2
นี่จะเป็นวิธี "เหมาะสม" ในการปรับข้อมูลโดยสมมติว่าไม่มีเหตุผลอื่นในคลาสย่อย (เช่นการเพิ่มมุมมองเป็นต้น) นอกจากนี้วิธีนี้สามารถใช้เพื่ออัปเดตข้อความส่วนหัวสำหรับ Dynamic Type เพียงแค่ใช้: header.textLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];และ / หรือheader.detailTextLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];พร้อมกับขั้นตอนอื่น ๆ ที่จำเป็น (ดูที่นี่: captechconsulting.com/blog/john-szumski/... )
ลีแอนน์

3
นี่ไม่ใช่การปรับขนาดมุมมองส่วนหัวดังนั้นหากแบบอักษรของคุณมีขนาดใหญ่ขึ้นหรือแตกต่างกันอย่างมีนัยสำคัญเช่น Zapfino (ไม่ต้องถามสาเหตุ) มันจะตัดข้อความออก หากคุณต้องคำนวณขนาดด้วยตัวคุณเองมันจะเลอะเทอะและคุณไม่ควรทำ
Leo Natan

@CocoaPriest ไม่ล้มเหลวในรุ่นเบต้าของฉัน tho (เมล็ดพันธุ์ GM) 2
Patrick Bassut

96

ในขณะที่คำตอบของ mosca1337 เป็นคำตอบที่ถูกต้องให้ระวังด้วยวิธีการนั้น สำหรับส่วนหัวที่มีข้อความยาวเกินหนึ่งบรรทัดคุณจะต้องทำการคำนวณความสูงของส่วนหัวtableView:heightForHeaderInSection:ที่อาจยุ่งยาก

วิธีที่นิยมใช้กันมากคือการใช้ API การปรากฏ:

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

สิ่งนี้จะเปลี่ยนแบบอักษรในขณะที่ยังคงออกจากตารางเพื่อจัดการความสูงเอง

เพื่อผลลัพธ์ที่ดีที่สุดให้แบ่งคลาสย่อยของมุมมองตารางและเพิ่มลงในห่วงโซ่การบรรจุ (ในappearanceWhenContainedIn:) เพื่อให้แน่ใจว่าแบบอักษรจะเปลี่ยนเฉพาะสำหรับมุมมองตารางที่ระบุเท่านั้น


1
หากคลาสย่อยคุณจะส่งคืนมุมมองที่กำหนดเองจาก- tableView:viewForHeaderInSection:ด้านขวาหรือไม่ ในกรณีนี้แบบอักษรสามารถตั้งค่าได้ที่นั่น นี่คือวิธีการแก้ปัญหาของ @ mosca1337
trss

1
ฮ่าฮ่าดีฉันเป็น woozey หลังจากเมื่อวาน ซับคลาสมุมมองตารางและเพิ่มลงในรายการคอนเทนเนอร์ ;-)
Leo Natan

2
วิธีนี้ทำให้เกิดข้อบกพร่องมากมายด้วยการคำนวณขนาดส่วนท้าย / ส่วนหัวจริง ฉันสามารถแสดงตัวอย่างบางส่วนเมื่อชื่อถูกตัดในขณะที่ตั้งค่าแบบอักษรที่กำหนดเอง
kas-kad

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

3
สิ่งนี้ไม่ปรับขนาดฉลากอย่างถูกต้องเพื่อให้พอดีกับแบบอักษรบน iOS 11 นอกจากนี้การเลื่อนขึ้นและลงหลังจากโหลดมุมมองจะรีเซ็ตเป็นแบบอักษรเริ่มต้น
nickdnk

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
นี่จะไม่ปรับขนาดมุมมองส่วนหัวให้พอดีกับแบบอักษรใหม่
Leo Natan

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

นั่นเป็นวิธีที่ง่ายที่สุดที่ฉันกำลังมองหา
Ryan

ทำงานได้อย่างรวดเร็ว 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 เพื่อแก้ไขปัญหานี้:

ใช้ความสูง ForHeaderInSection เช่น:

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

    return 30.0 // Or whatever height you want!
  }

4

คำตอบของ Leo Natan เวอร์ชัน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

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

นี่คือทางออกของฉันกับ swift 5

ในการควบคุมมุมมองส่วนหัวอย่างสมบูรณ์คุณต้องใช้วิธี tableView (: viewForHeaderInsection: :) ในตัวควบคุมของคุณตามที่โพสต์ก่อนหน้านี้แสดง อย่างไรก็ตามมีขั้นตอนเพิ่มเติมคือเพื่อปรับปรุงประสิทธิภาพแอปเปิ้ลไม่แนะนำให้สร้างมุมมองใหม่ทุกครั้ง แต่เพื่อใช้มุมมองส่วนหัวอีกครั้งเหมือนกับเซลล์ตารางที่นำมาใช้ซ้ำ นี่คือวิธีการ tableView.dequeueReusableHeaderFooterView (withIdentifier:) แต่ปัญหาที่ฉันมีคือเมื่อคุณเริ่มใช้ฟังก์ชั่นการใช้งานซ้ำแบบอักษรจะไม่ทำงานอย่างที่คาดไว้ สิ่งอื่น ๆ เช่นสีการจัดตำแหน่งปรับทั้งหมด แต่เพียงตัวอักษร มีการพูดคุยกันบ้าง แต่ฉันทำให้มันใช้งานได้ดังต่อไปนี้

ปัญหาคือ tableView.dequeueReusableHeaderFooterView (withIdentifier :) ไม่เหมือน tableView.dequeneReuseCell (:) ซึ่งจะส่งคืนเซลล์เสมอ อดีตจะคืนค่าศูนย์ถ้าไม่มี แม้ว่าจะส่งคืนมุมมองส่วนหัวที่นำมาใช้ซ้ำมันไม่ใช่ประเภทคลาสดั้งเดิมของคุณ แต่เป็น UITableHeaderFooterView ดังนั้นคุณต้องตัดสินใจและดำเนินการตามรหัสของคุณเอง โดยทั่วไปถ้ามันเป็นศูนย์รับมุมมองส่วนหัวใหม่ หากไม่เป็นศูนย์ให้บังคับโยนเพื่อให้คุณสามารถควบคุมได้

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.