ปรับแต่งส่วนหัวของ UITableView


141

ฉันต้องการปรับแต่งUITableViewส่วนหัวสำหรับแต่ละส่วน จนถึงตอนนี้ฉันได้ลงมือปฏิบัติ

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

นี้UITabelViewDelegateวิธีการ สิ่งที่ฉันต้องการทำคือรับส่วนหัวปัจจุบันสำหรับแต่ละส่วนและเพียงเพิ่มUILabelเป็นมุมมองย่อย

จนถึงตอนนี้ฉันไม่สามารถทำเช่นนั้นได้ เนื่องจากฉันไม่พบสิ่งใดที่จะได้รับส่วนหัวเริ่มต้น คำถามแรกมีวิธีใดที่จะได้รับส่วนหัวเริ่มต้นหรือไม่

ถ้าเป็นไปไม่ได้ฉันต้องสร้างมุมมองคอนเทนเนอร์ซึ่งเป็นUIViewแต่คราวนี้ฉันต้องตั้งค่าสีพื้นหลังเริ่มต้นสีเงา ฯลฯ เพราะถ้าคุณดูอย่างระมัดระวังในส่วนหัวของส่วนมันปรับแต่งแล้ว

ฉันจะรับค่าเริ่มต้นเหล่านี้สำหรับส่วนหัวของแต่ละส่วนได้อย่างไร

ขอบคุณทุกคน.


1
มีอะไรผิดปกติกับการใช้งานtableView:titleForHeaderInSection:?
borrrden

มันคืนค่า a NSString, ฉันต้องตั้งค่าฟอนต์ที่กำหนดเองดังนั้นฉันไม่สามารถใช้ถ้าฉันใช้tableView:titleForHeaderInSection:
limon

หรือคุณสามารถใช้รูปภาพเพื่อเลียนแบบส่วนหัวเริ่มต้น teehanlax.com/blog/ios-6-gui-psd-iphone-5
Desdenova

@limon: วิธีการใช้ส่วนหัวของส่วน: stackoverflow.com/a/32261262/1457385
ตื้น

คำตอบ:


288

คุณสามารถลองสิ่งนี้:

 -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 18)];
    /* Create custom view to display section header... */
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 5, tableView.frame.size.width, 18)];
    [label setFont:[UIFont boldSystemFontOfSize:12]];
     NSString *string =[list objectAtIndex:section];
    /* Section header is in 0th index... */
    [label setText:string];
    [view addSubview:label];
    [view setBackgroundColor:[UIColor colorWithRed:166/255.0 green:177/255.0 blue:186/255.0 alpha:1.0]]; //your background color...
    return view;
}

นั่นคือสี bg ของคุณสีใดก็ตามที่คุณต้องการตั้งค่าให้คุณทำได้
Lochana Ragupathy

นั่นเป็นปัญหาฉันได้ทำสิ่งที่คุณเขียนไปแล้ว แต่ฉันไม่รู้สีพื้นหลังเริ่มต้นของส่วนหัวซึ่งเป็นสีเทา แต่ฉันต้องการให้เป็นส่วนหัวของค่าเริ่มต้นที่แน่นอน
limon

15
เฮ้มาใช้มิเตอร์สีดิจิตอล
Lochana Ragupathy

ตรวจสอบให้แน่ใจว่าตั้งค่า backgroundColor ของ UILabel ด้วย ฉันรู้ว่าฉันสับสนเล็กน้อยเมื่อพื้นหลังของฉันไม่ชัดเจนสำหรับฉัน
shulmey

3
รายการในบรรทัด NSString * string = [list objectAtIndex: section]; ไม่มีใครสามารถบอกฉันได้
Nisha Gupta

45

คำตอบที่เลือกใช้tableView :viewForHeaderInSection:นั้นถูกต้อง

เพียงแบ่งปันเคล็ดลับที่นี่

หากคุณใช้สตอรีบอร์ด / xib คุณสามารถสร้างเซลล์ต้นแบบอีกเซลล์หนึ่งและใช้กับ "เซลล์ส่วน" ของคุณได้ รหัสในการกำหนดค่าส่วนหัวคล้ายกับวิธีที่คุณกำหนดค่าสำหรับเซลล์แถว

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    static NSString *HeaderCellIdentifier = @"Header";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:HeaderCellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:HeaderCellIdentifier];
    }

    // Configure the cell title etc
    [self configureHeaderCell:cell inSection:section];

    return cell;
}

14
มีหลายสิ่งที่ผิดปกติ w / วิธีแก้ปัญหานี้ สิ่งแรกคือความจริงที่ว่าถ้าคุณใช้ "tableView (tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool" คุณจะสังเกตเห็นว่าส่วนหัวของส่วนจะเลื่อนตามแถวเมื่อคุณเลื่อน เพื่อหลีกเลี่ยงปัญหานี้คุณต้องส่งคืน cell.contentView แทน ปัญหาที่ใหญ่กว่าคือความจริงที่ว่าเมื่อใช้วิธีนี้แอปจะหยุดทำงานเมื่อคุณกดส่วนหัวของส่วน วิธีที่ถูกต้องคือการสร้างไส้ปากกาที่ขยาย UITableViewHeaderFooterView ลงทะเบียนด้วย w / the tableview และส่งกลับมาในวิธีนี้ ทดสอบกับ iOS8
Kachi

@ Kachi วิธีแก้ปัญหานี้ใช้viewForHeaderInSectionไม่ได้canEditRowAtIndexPathตามที่คุณพูดถึง ฉันไม่เคยตรวจสอบความผิดพลาดที่คุณพูด แต่คุณจะรู้ได้อย่างไรว่าการกดแบบยาวจะทำให้เกิดความผิดพลาดหรือไม่?
samwize

1
สิ่งที่ฉันหมายถึงคือถ้าคุณใช้โซลูชันนี้และใช้ canEditRowAtIndexPath คุณจะเห็นว่าส่วนหัวจะเลื่อนไปพร้อมกับแถวบนสุดที่คุณกำลังลบหากคุณไม่ส่งคืน cell.contentView ดูโพสต์ SO นี้: stackoverflow.com/questions/26009722/… การกดแบบยาวทำให้เกิดความผิดพลาดเนื่องจากข้อความพยายามส่งไปยังวัตถุที่จัดสรรคืน ดูโพสต์ SO นี้: stackoverflow.com/questions/27622290/ …
Kachi

1
โปรดอย่าใช้UITableViewCellเป็นมุมมองส่วนหัว คุณจะได้รับยากมากในการแก้ไขข้อบกพร่องภาพ - บางครั้งส่วนหัวจะหายไปเนื่องจากวิธี dequeued เซลล์และคุณจะมองหาชั่วโมงว่าทำไมเป็นเช่นนั้นจนกว่าคุณUITableViewCellจะรู้ว่าไม่ได้อยู่ในUITableViewส่วนหัว
raven_raven

การใช้UITableViewCellส่วนหัวเป็นสิ่งที่ผิด
Alex Zavatone

31

คำตอบของLochana Tejasรุ่นที่รวดเร็ว:

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let view = UIView(frame: CGRectMake(0, 0, tableView.frame.size.width, 18))
    let label = UILabel(frame: CGRectMake(10, 5, tableView.frame.size.width, 18))
    label.font = UIFont.systemFontOfSize(14)
    label.text = list.objectAtIndex(indexPath.row) as! String
    view.addSubview(label)
    view.backgroundColor = UIColor.grayColor() // Set your background color

    return view
}

1
วิธีการทำให้ป้ายความสูงแบบไดนามิกตามข้อความซึ่งอยู่ในมุมมอง?
Pratik Shah

overrideคำหลักที่ซ้ำซ้อน มีอะไรเพิ่มเติมให้ลองใช้มุมมองส่วนหัวซ้ำอีกครั้งแทนที่จะสร้างมุมมองใหม่
Vadim Bulavin

17

หากคุณใช้มุมมองส่วนหัวเริ่มต้นคุณสามารถเปลี่ยนข้อความได้ด้วย

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

สำหรับ Swift:

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {

หากคุณต้องการกำหนดมุมมองเองคุณต้องสร้างมุมมองใหม่ด้วยตนเอง


10

ทำไมไม่ใช้UITableViewHeaderFooterView ?


คุณสามารถใช้สิ่งนี้ได้หากคุณไม่ใช้ - (UIView *) tableView: (UITableView *) tableView viewForHeaderInSection: (NSInteger) ส่วน
SAHM

1
คำตอบที่ถูกต้องสมบูรณ์แบบ นอกจากนี้การใช้ UITableViewHeaderFooterView ประโยชน์จากการรีไซเคิลมุมมองเหมือนเซลล์
Gregzo

6
@dmarsi ฉันไม่พบหลักฐานว่าพวกเขาถูกคัดค้าน
ฟอกซ์

8

หาก headerInSection ไม่แสดงให้ลองสิ่งนี้

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return 45;
}

ส่งคืนความสูงสำหรับส่วนหัวของส่วนที่กำหนด


1
สนใจที่จะอธิบายคำตอบของคุณไหม?
CinCout

ส่วนหัวจะไม่แสดงจนกว่าคุณจะระบุด้วยวิธีการที่ 'ความสูง' ของส่วนหัว UITableView เป็นค่าเริ่มต้นที่จะไม่แสดงส่วนหัวหากไม่ได้ระบุความสูง @CinCout
theprojectabot

6

Lochana และ Estemendoza เวอร์ชั่น Swift 3

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

    let view = UIView(frame: CGRect(x:0, y:0, width:tableView.frame.size.width, height:18))
    let label = UILabel(frame: CGRect(x:10, y:5, width:tableView.frame.size.width, height:18))
    label.font = UIFont.systemFont(ofSize: 14)
    label.text = "This is a test";
    view.addSubview(label);
    view.backgroundColor = UIColor.gray;
    return view

}

นอกจากนี้โปรดทราบว่าคุณยังต้องใช้:

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

5

ลองนี้ ......

override func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) 
{
    // Background view is at index 0, content view at index 1
    if let bgView = view.subviews[0] as? UIView
    {
        // do your stuff
    }

    view.layer.borderColor = UIColor.magentaColor().CGColor
    view.layer.borderWidth = 1
}

5

คำตอบอื่น ๆ ทำงานได้ดีในการสร้างมุมมองส่วนหัวเริ่มต้นใหม่ แต่อย่าตอบคำถามหลักของคุณ:

มีวิธีการรับส่วนหัวเริ่มต้นหรือไม่

มีวิธี - เพียงนำไปใช้tableView:willDisplayHeaderView:forSection:ในตัวแทนของคุณ มุมมองส่วนหัวเริ่มต้นจะถูกส่งผ่านไปยังพารามิเตอร์ที่สองและจากนั้นคุณสามารถส่งไปที่ a UITableViewHeaderFooterViewและจากนั้นเพิ่ม / เปลี่ยนการดูย่อยตามที่คุณต้องการ

Obj-C

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

    // Do whatever with the header view... e.g.
    // headerView.textLabel.textColor = [UIColor whiteColor]
}

รวดเร็ว

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

    // Do whatever with the header view... e.g.
    // headerView.textLabel?.textColor = UIColor.white
}

คุณไม่จำเป็นต้องร่ายมัน คุณสามารถเพิ่มสิ่งที่คุณต้องการในมุมมอง viewในความเป็นจริงการสร้างวัตถุใหม่จะทำอะไรจนกว่าคุณจะกำหนดให้
Alex Zavatone

@AlexZavatone ถูกต้องคุณไม่จำเป็นต้องแปลงมันหากคุณเพิ่งเพิ่มมุมมอง มีประโยชน์ถ้าคุณต้องการปรับแต่งมุมมองเริ่มต้นเช่นป้ายข้อความ
Craig Brown

4
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    //put your values, this is part of my code
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 30.0f)];
    [view setBackgroundColor:[UIColor redColor]];
    UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(20, 5, 150, 20)];
    [lbl setFont:[UIFont systemFontOfSize:18]];
    [lbl setTextColor:[UIColor blueColor]];
    [view addSubview:lbl];

    [lbl setText:[NSString stringWithFormat:@"Section: %ld",(long)section]];

    return view;
}

4

นี่เป็นทางออกที่ง่ายที่สุดเท่าที่จะเป็นไปได้ รหัสต่อไปนี้สามารถนำมาใช้โดยตรงสำหรับการสร้างส่วนหัวที่กำหนดเอง

 -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    SectionHeaderTableViewCell *headerView = [tableView dequeueReusableCellWithIdentifier:@"sectionHeader"];

    //For creating a drop menu of rows from the section
    //==THIS IS JUST AN EXAMPLE. YOU CAN REMOVE THIS IF-ELSE.==
    if (![self.sectionCollapsedArray[section] boolValue])
    {
        headerView.imageView.image = [UIImage imageNamed:@"up_icon"];
    }
    else
    {
        headerView.imageView.image = [UIImage imageNamed:@"drop_icon"];
    }

    //For button action inside the custom cell
    headerView.dropButton.tag = section;
    [headerView.dropButton addTarget:self action:@selector(sectionTapped:) forControlEvents:UIControlEventTouchUpInside];

    //For removing long touch gestures.
    for (UIGestureRecognizer *recognizer in headerView.contentView.gestureRecognizers)
    {
        [headerView.contentView removeGestureRecognizer:recognizer];
        [headerView removeGestureRecognizer:recognizer];
    }

    return headerView.contentView;
}

หมายเหตุ: SectionHeaderTableViewCell เป็น UITableViewCell แบบกำหนดเองที่สร้างขึ้นใน Storyboard


SectionHeaderTableViewCell - การใช้ตัวระบุที่ไม่ได้ประกาศ
Boris Gafurov

@ BorisGafurov SectionHeaderTableViewCell เป็นเพียงชื่อตัวอย่างที่ฉันให้ UITableViewCell ซึ่งฉันสร้างในกระดานเรื่องราว
Anish Kumar

2

ถ้าฉันเป็นคุณฉันจะทำให้วิธีการที่จะส่งกลับ UIView ให้ NSString มี ตัวอย่างเช่น

+ (UIView *) sectionViewWithTitle:(NSString *)title;

ในการใช้วิธีการนี้จะสร้าง UIView เพิ่ม UILabel ด้วยคุณสมบัติที่คุณต้องการตั้งค่าและแน่นอนตั้งชื่อเป็นชื่อที่กำหนด


ใช่ฉันสามารถทำได้ แต่คำถามของฉันคือฉันจะได้รับพื้นหลังส่วนหัวเริ่มต้นค่าเงาส่วนที่เหลือใช้งานง่ายได้อย่างไร
limon

สิ่งที่คุณหมายถึงโดยพื้นหลังส่วนหัวเริ่มต้น
Lochana Ragupathy

1
วิธีที่ง่ายที่สุดคือใช้แอปพลิเคชั่น Digital Color Meter เพื่อรับสีที่คุณต้องการ การใช้รหัสเป็นเรื่องที่ยากเท่าที่ฉันจะบอกได้ ...
cpprulez

2

@ แก้ปัญหาของ samwize ใน Swift (โหวตขึ้นเขาเลย!) ใช้กลไกการรีไซเคิลที่ยอดเยี่ยมเช่นเดียวกันสำหรับส่วนหัว / ท้ายกระดาษ:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let settingsHeaderSectionCell:SettingsHeaderSectionCell = self.dequeueReusableCell(withIdentifier: "SettingsHeaderSectionCell") as! SettingsHeaderSectionCell

    return settingsHeaderSectionCell
}

2
- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
{
    if([view isKindOfClass:[UITableViewHeaderFooterView class]]){

        UITableViewHeaderFooterView *headerView = view;

        [[headerView textLabel] setTextColor:[UIColor colorWithHexString:@"666666"]];
        [[headerView textLabel] setFont:[UIFont fontWithName:@"fontname" size:10]];
    }
}

หากคุณต้องการเปลี่ยนแบบอักษรของ textLabel ในส่วนหัวของส่วนที่คุณต้องการจะทำใน willDisplayHeaderView ในการตั้งค่าข้อความคุณสามารถทำได้ใน viewForHeaderInSection หรือ titleForHeaderInSection โชคดี!


2

ตัวอย่างเต็ม 2019 เพื่อคัดลอกและวาง

อันดับแรกตั้ง "จัดกลุ่ม" ไว้บนกระดานเรื่องราว: ต้องเกิดขึ้นในเวลาเริ่มต้นคุณไม่สามารถกำหนดได้ในภายหลังดังนั้นจึงง่ายต่อการจดจำในกระดานเรื่องราว:

ป้อนคำอธิบายรูปภาพที่นี่

ต่อไป,

ต้องใช้ความสูง heightForHeaderInSectionเนื่องจากข้อผิดพลาดของ Apple

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

ยังมีข้อบกพร่องของ Apple อยู่เป็นเวลาสิบปีแล้วซึ่งจะไม่แสดงส่วนหัวแรก (เช่นดัชนี 0) หากคุณไม่มีheightForHeaderInSectionสาย

ดังนั้นtableView.sectionHeaderHeight = 70ก็ไม่ได้ทำงานมันเสีย

การตั้งค่าเฟรมทำได้โดยไม่ทำอะไรเลย:

ในviewForHeaderInSectionเพียงแค่สร้าง UIView (ที่)

มันไม่มีจุดหมาย / ไม่ทำอะไรเลยถ้าคุณUIView (เฟรม ... )ตั้งแต่ iOS เพียงแค่กำหนดขนาดของมุมมองตามตาราง

ดังนั้นบรรทัดแรกของviewForHeaderInSectionจะง่ายlet view = UIView()และนั่นคือมุมมองที่คุณกลับมา

func tableView(_ tableView: UITableView,
                       viewForHeaderInSection section: Int) -> UIView? {
    let view = UIView()
    
    let l = UILabel()
    view.addSubview(l)
    l.bindEdgesToSuperview()
    l.backgroundColor = .systemOrange
    l.font = UIFont.systemFont(ofSize: 15)
    l.textColor = .yourClientsFavoriteColor
    
    switch section {
    case 0:
        l.text =  "First section on screen"
    case 1:
        l.text =  "Here's the second section"
    default:
        l.text =  ""
    }
    
    return view
}

แค่นั้นแหละ - สิ่งอื่นใดที่ทำให้คุณเสียเวลา

ปัญหาแอปเปิ้ล "จุกจิก" อีกเรื่อง


ส่วนขยายความสะดวกที่ใช้ด้านบนคือ:

extension UIView {
    
    // incredibly useful:
    
    func bindEdgesToSuperview() {
        
        guard let s = superview else {
            preconditionFailure("`superview` nil in bindEdgesToSuperview")
        }
        
        translatesAutoresizingMaskIntoConstraints = false
        leadingAnchor.constraint(equalTo: s.leadingAnchor).isActive = true
        trailingAnchor.constraint(equalTo: s.trailingAnchor).isActive = true
        topAnchor.constraint(equalTo: s.topAnchor).isActive = true
        bottomAnchor.constraint(equalTo: s.bottomAnchor).isActive = true
    }
}

1

เพิ่มส่วนหัวของมุมมองตารางอย่างรวดเร็วอย่างน่าอัศจรรย์

ฉันเพิ่งลองสิ่งนี้

ฉันต้องการหนึ่งส่วนหัวเพียงหนึ่งเดียวใน UITableView ทั้งหมด

เช่นฉันต้องการ UIImageView ที่ด้านบนของ TableView ดังนั้นฉันจึงเพิ่ม UIImageView ที่ด้านบนของ UITableViewCell และโดยอัตโนมัติมันถูกเพิ่มเป็น tableViewHeader ตอนนี้ฉันเชื่อมต่อ ImageView เข้ากับ ViewController และเพิ่มรูปภาพ

ฉันสับสนเพราะฉันทำอะไรแบบนี้เป็นครั้งแรก ดังนั้นเพื่อล้างความสับสนของฉันเปิดรูปแบบ xml ของ MainStoryBoard และพบว่ามุมมองภาพถูกเพิ่มเป็นส่วนหัว

มันใช้งานได้สำหรับฉัน ขอบคุณ xCode และรวดเร็ว


1

เรียกวิธีการมอบหมายนี้

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

return @"Some Title";
}

สิ่งนี้จะให้โอกาสในการเพิ่มส่วนหัวเริ่มต้นพร้อมชื่อแบบไดนามิกโดยอัตโนมัติ

คุณสามารถใช้ส่วนหัว / ท้ายกระดาษที่ใช้ซ้ำได้และปรับแต่งได้

https://github.com/sourov2008/UITableViewCustomHeaderFooterSection


1

swif 4.2

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    guard let header = view as? UITableViewHeaderFooterView else { return }

    header.textLabel?.textAlignment = .center // for all sections

    switch section {
    case 1:  //only section No.1
        header.textLabel?.textColor = .black
    case 3:  //only section No.3
        header.textLabel?.textColor = .red
    default: //
        header.textLabel?.textColor = .yellow
    }
}


0

หากคุณเพียงแค่ต้องการเพิ่มชื่อให้กับส่วนหัวของ tableView อย่าเพิ่มมุมมอง ใน swift 3.x โค้ดจะเป็นดังนี้:

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    var lblStr = ""
    if section == 0 {
        lblStr = "Some String 1"
    }
    else if section == 1{
        lblStr = "Some String 2"
    }
    else{
        lblStr = "Some String 3"
    }
    return lblStr
}

คุณอาจใช้อาเรย์เพื่อดึงชื่อสำหรับส่วนหัว


0

กลับไปที่คำถามเดิม (4 ปีต่อมา) แทนที่จะสร้างส่วนหัวใหม่ของคุณเอง iOS สามารถโทรหาคุณได้ (ด้วย willDisplayHeaderView: forSection :) ทันทีหลังจากสร้างค่าเริ่มต้นแล้ว ตัวอย่างเช่นฉันต้องการเพิ่มปุ่มกราฟที่ขอบด้านขวาของส่วนหัว:

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
    UITableViewHeaderFooterView * header = (UITableViewHeaderFooterView *) view;
    if (header.contentView.subviews.count >  0) return; //in case of reuse
    CGFloat rightEdge = CGRectGetMaxX(header.contentView.bounds);
    UIButton * button = [[UIButton alloc] initWithFrame:CGRectMake(rightEdge - 44, 0, 44, CGRectGetMaxY(header.contentView.bounds))];
    [button setBackgroundImage:[UIImage imageNamed:@"graphIcon"] forState:UIControlStateNormal];
    [button addTarget:self action:@selector(graphButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
    [view addSubview:button];
}

0

ใช้tableView: willDisplayHeaderView:เพื่อปรับแต่งมุมมองเมื่อมันกำลังจะถูกแสดง

สิ่งนี้ช่วยให้คุณได้เปรียบในการใช้มุมมองที่สร้างไว้แล้วสำหรับมุมมองส่วนหัวและขยายมุมมองแทนที่จะต้องสร้างมุมมองส่วนหัวทั้งหมดด้วยตัวเอง

นี่คือตัวอย่างที่สีส่วนหัวตาม BOOL และเพิ่มองค์ประกอบข้อความรายละเอียดไปที่ส่วนหัว

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
{
//    view.tintColor = [UIColor colorWithWhite:0.825 alpha:1.0]; // gray
//    view.tintColor = [UIColor colorWithRed:0.825 green:0.725 blue:0.725 alpha:1.0]; // reddish
//    view.tintColor = [UIColor colorWithRed:0.925 green:0.725 blue:0.725 alpha:1.0]; // pink

    // Conditionally tint the header view
    BOOL isMyThingOnOrOff = [self isMyThingOnOrOff];

    if (isMyThingOnOrOff) {
        view.tintColor = [UIColor colorWithRed:0.725 green:0.925 blue:0.725 alpha:1.0];
    } else {
        view.tintColor = [UIColor colorWithRed:0.925 green:0.725 blue:0.725 alpha:1.0];
    }

    /* Add a detail text label (which has its own view to the section header… */
    CGFloat xOrigin = 100; // arbitrary
    CGFloat hInset = 20;
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(xOrigin + hInset, 5, tableView.frame.size.width - xOrigin - (hInset * 2), 22)];

    label.textAlignment = NSTextAlignmentRight;

    [label setFont:[UIFont fontWithName:@"Helvetica-Bold" size:14.0]
    label.text = @"Hi.  I'm the detail text";

    [view addSubview:label];
}

0

สวิฟท์ 4.2

ใน Swift 4.2 ชื่อของตารางจะเปลี่ยนไปเล็กน้อย

    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let view = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 18))
        let label = UILabel(frame: CGRect(x: 10, y: 5, width: tableView.frame.size.width, height: 18))
        label.font = UIFont.systemFont(ofSize: 14)
        label.text = list.objectAtIndex(section) as! String
        view.addSubview(label)
        view.backgroundColor = UIColor.gray // Set your background color

        return view
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.