การเพิ่ม iOS UITableView HeaderView (ไม่ใช่ส่วนหัวของส่วน)


167

ฉันต้องการเพิ่มส่วนหัวของตาราง (ไม่ใช่ส่วนหัวของส่วน) เช่นในแอปผู้ติดต่อตัวอย่างเช่น: ป้อนคำอธิบายรูปภาพที่นี่

แบบนั้น - ฉลากข้างภาพเหนือตาราง

ฉันต้องการให้มุมมองทั้งหมดเลื่อนได้ดังนั้นฉันจึงไม่สามารถวางมุมมองเหล่านั้นไว้นอกตารางได้

ฉันจะทำสิ่งนั้นได้อย่างไร

คำตอบ:


245

UITableViewมีtableHeaderViewคุณสมบัติ ตั้งค่าเป็นมุมมองอะไรก็ได้ที่คุณต้องการ

ใช้อันใหม่UIViewเป็นที่บรรจุเพิ่มเลเบลข้อความและมุมมองรูปภาพเป็นที่ใหม่UIViewจากนั้นตั้งค่าtableHeaderViewเป็นมุมมองใหม่

ตัวอย่างเช่นในUITableViewController:

-(void)viewDidLoad
{
     // ...
     UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(XXX, YYY, XXX, YYY)];
     UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(XXX, YYY, XXX, YYY)];
     [headerView addSubview:imageView];
     UILabel *labelView = [[UILabel alloc] initWithFrame:CGRectMake(XXX, YYY, XXX, YYY)];
     [headerView addSubview:labelView];
     self.tableView.tableHeaderView = headerView;
     [imageView release];
     [labelView release];
     [headerView release];
     // ...
} 

ที่ดี! ขอบคุณมันทำงานได้ดี มีคุณสมบัติใดที่ทำให้เซลล์ tableview โตขึ้นมากเท่ากับตัวหนังสือข้างใน?
Assaf b

ในการทำเช่นนั้นคุณจะต้องสามารถคำนวณความสูงของเซลล์ที่กำหนดสตริงและส่งผ่านค่านั้นสำหรับ heightForRowAtIndexPath คุณสามารถใช้เมธอด sizeWithFont: constrainedToSize: NSString เพื่อคำนวณความสูงของข้อความเมื่อถูก จำกัด ขนาด
ทำเครื่องหมาย

เพิ่มหลังเลย์เอาท์มิฉะนั้นขนาดจะไม่ต้องการ และ viewDidLoad เป็นสถานที่ที่ดี
BollMose

เป็นการดีหรือไม่ที่จะกำหนดรูปทรงเรขาคณิตของมุมมองในระหว่างเฟส viewDidLoad
Nandish

1
ตกลงถ้าคุณตั้งค่ามุมมองส่วนหัวในแหล่งที่มาของตารางดูเหมือนว่าจะทำงานตรวจสอบให้แน่ใจว่าได้ตั้งค่าความสูงด้วย: ตัวอย่าง:public override UIView GetViewForHeader(UITableView tableView, nint section) { return headerView; } public override nfloat GetHeightForHeader(UITableView tableView, nint section) { return headerView.Frame.Height; }
panthor314

193

คุณสามารถทำได้ง่ายๆใน Interface Builder เพียงสร้างมุมมองด้วยตารางและวางมุมมองอื่นลงบนตาราง นี่จะกลายเป็นมุมมองส่วนหัวของตาราง เพิ่มป้ายกำกับและรูปภาพของคุณในมุมมองนั้น ดูรูปด้านล่างสำหรับลำดับชั้นการดู ดูลำดับชั้นในเครื่องมือสร้างส่วนติดต่อ


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

1
ขอบคุณมากสำหรับคำใบ้ BTW คุณไม่จำเป็นต้องมีมุมมองเลื่อนในส่วนหัวของคุณในกรณีที่คนอื่นสงสัยหรือลองทำเช่นนั้น มันใช้ ScrollView ของ UITableView สำหรับ Header ของคุณเนื่องจาก Header ในทางเทคนิคเป็นส่วนหนึ่งของ UITableView
Rob R.

2
ควรกล่าวถึงวิธีการทำงานในตัวแก้ไข StoryBoard ทันที: stackoverflow.com/q/7841167/926907
Dmitry Zaytsev

อย่าใช้ปลายปากกาสำหรับสิ่งนี้ ใช้เวลาโหลดนานขึ้น เขียนเป็นรหัส สามารถนำมาใช้สำหรับการสร้างชั้นที่กำหนดเองและ instantiate ...
ชาร์ลส์โรเบิร์ต

1
มันจะไม่ให้ฉันเพิ่มข้อจำกัดความสูงของมุมมองส่วนหัว
Ian Warburton

14

ในสวิฟต์ :

override func viewDidLoad() {
    super.viewDidLoad()

    // We set the table view header.
    let cellTableViewHeader = tableView.dequeueReusableCellWithIdentifier(TableViewController.tableViewHeaderCustomCellIdentifier) as! UITableViewCell
    cellTableViewHeader.frame = CGRectMake(0, 0, self.tableView.bounds.width, self.heightCache[TableViewController.tableViewHeaderCustomCellIdentifier]!)
    self.tableView.tableHeaderView = cellTableViewHeader

    // We set the table view footer, just know that it will also remove extra cells from tableview.
    let cellTableViewFooter = tableView.dequeueReusableCellWithIdentifier(TableViewController.tableViewFooterCustomCellIdentifier) as! UITableViewCell
    cellTableViewFooter.frame = CGRectMake(0, 0, self.tableView.bounds.width, self.heightCache[TableViewController.tableViewFooterCustomCellIdentifier]!)
    self.tableView.tableFooterView = cellTableViewFooter
}

การใช้วิธีนี้สำหรับ iOS 7 หรือสูงกว่าจะทำให้เกิดการเตือนรันไทม์: "ไม่มีพา ธ ดัชนีสำหรับเซลล์ตารางที่ถูกนำมาใช้ซ้ำ" เพื่อหลีกเลี่ยงข้อผิดพลาดนี้ให้อ้างอิงลิงค์
baskInEminence

11

นอกจากนี้คุณยังสามารถสร้าง UIView ในเครื่องมือสร้างส่วนต่อประสานและลากและวาง ImageView และ UILabel (เพื่อให้ดูเหมือนกับส่วนหัวที่คุณต้องการ) จากนั้นใช้

เมื่อ UIView ของคุณดูเหมือนกับวิธีที่คุณต้องการเช่นกันคุณสามารถกำหนดค่าเริ่มต้นโดยทางโปรแกรมจาก XIB และเพิ่มลงใน UITableView ของคุณ คุณไม่จำเป็นต้องออกแบบตารางทั้งหมดใน IB เพียงแค่ headerView (วิธีนี้สามารถใช้มุมมองส่วนหัวในตารางอื่นได้เช่นกัน)

ตัวอย่างเช่นฉันมี UIView ที่กำหนดเองสำหรับหนึ่งในส่วนหัวของตาราง มุมมองได้รับการจัดการโดยไฟล์ xib ชื่อ "CustomHeaderView" และโหลดลงในส่วนหัวของตารางโดยใช้รหัสต่อไปนี้ในคลาสย่อย UITableViewController ของฉัน:

-(UIView *) customHeaderView {
    if (!customHeaderView) {
        [[NSBundle mainBundle] loadNibNamed:@"CustomHeaderView" owner:self options:nil];
    }

    return customHeaderView;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Set the CustomerHeaderView as the tables header view 
    self.tableView.tableHeaderView = self.customHeaderView;
}

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

    UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0,0,tableView.frame.size.width,30)];
    headerView.backgroundColor=[[UIColor redColor]colorWithAlphaComponent:0.5f];
    headerView.layer.borderColor=[UIColor blackColor].CGColor;
    headerView.layer.borderWidth=1.0f;

    UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 5,100,20)];

    headerLabel.textAlignment = NSTextAlignmentRight;
    headerLabel.text = @"LeadCode ";
    //headerLabel.textColor=[UIColor whiteColor];
    headerLabel.backgroundColor = [UIColor clearColor];


    [headerView addSubview:headerLabel];

    UILabel *headerLabel1 = [[UILabel alloc] initWithFrame:CGRectMake(60, 0, headerView.frame.size.width-120.0, headerView.frame.size.height)];

    headerLabel1.textAlignment = NSTextAlignmentRight;
    headerLabel1.text = @"LeadName";
    headerLabel.textColor=[UIColor whiteColor];
    headerLabel1.backgroundColor = [UIColor clearColor];

    [headerView addSubview:headerLabel1];

    return headerView;

}

ไม่เข้าใจคำถามของคุณ?
Priyam

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