Thêm HeaderView iOS UITableView (không phải tiêu đề phần)


167

Tôi muốn thêm tiêu đề bảng (không phải tiêu đề phần) như trong ứng dụng danh bạ chẳng hạn: nhập mô tả hình ảnh ở đây

chính xác như thế - một nhãn bên cạnh một hình ảnh phía trên bảng.

Tôi muốn tất cả các chế độ xem có thể cuộn để tôi không thể đặt những cái đó bên ngoài bàn.

Làm thế nào tôi có thể làm điều đó?

Câu trả lời:


245

UITableViewcó một tableHeaderViewtài sản. Đặt nó vào bất cứ chế độ xem nào bạn muốn ở đó.

Sử dụng một cái mới UIViewnhư một thùng chứa, thêm nhãn văn bản và chế độ xem hình ảnh vào cái mới UIViewđó, sau đó đặttableHeaderView chế độ xem mới.

Ví dụ: trong một 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];
     // ...
} 

Tuyệt quá! Cảm ơn nó đã làm việc. Có thuộc tính nào làm cho các ô xem bảng phát triển lớn như văn bản bên trong không?
Assaf b

Để làm được điều đó, bạn cần có khả năng tính chiều cao của ô được cung cấp một chuỗi và truyền giá trị đó vào cho heightForRowAtIndexPath. Bạn có thể sử dụng phương thức size của NSStringWithFont: Ràng buộcToSize: để tìm ra chiều cao của văn bản khi bị ràng buộc với kích thước.
Đánh dấu

Thêm nó sau khi bố trí, hoặc kích thước của nó sẽ không như bạn muốn. Và viewDidLoad là một nơi tốt.
BollMose

Có phải là một cách thực hành tốt để đặt hình dạng của chế độ xem trong giai đoạn viewDidLoad không?
Nandish A

1
ok nếu bạn đặt chế độ xem tiêu đề trong nguồn bảng có vẻ hoạt động, hãy đảm bảo cũng đặt chiều cao: ví dụ:public override UIView GetViewForHeader(UITableView tableView, nint section) { return headerView; } public override nfloat GetHeightForHeader(UITableView tableView, nint section) { return headerView.Frame.Height; }
panthor314

193

Bạn có thể làm điều đó khá dễ dàng trong Interface Builder. Chỉ cần tạo một khung nhìn với một bảng và thả một khung nhìn khác vào bảng. Điều này sẽ trở thành chế độ xem tiêu đề bảng. Thêm nhãn và hình ảnh của bạn để xem. Xem pic dưới đây để phân cấp xem. Xem phân cấp trong Trình tạo giao diện


12
Tôi thích câu trả lời này vì tại sao lại viết mã khi tôi có thể thiết lập gọn gàng và định vị nó trong IB
Besi

1
tuyệt vời cảm ơn cho gợi ý. BTW bạn không cần một chế độ xem cuộn trong tiêu đề của mình trong trường hợp bất kỳ ai khác đang tự hỏi hoặc thử điều đó. Nó sử dụng ScrollView của UITableView cho Header của bạn, vì Header về mặt kỹ thuật là một phần của UITableView
Rob R.

2
Đáng để đề cập đến cách nó hoạt động trong trình soạn thảo StoryBoard ngay bây giờ: stackoverflow.com/q/7841167/926907
Dmitry Zaytsev

Đừng dùng ngòi cho việc này. Mất nhiều thời gian hơn để tải. Viết nó vào mã. Để có thể sử dụng lại, hãy tạo một lớp tùy chỉnh & khởi tạo ...
Charles Robertson

1
Nó sẽ không cho phép tôi thêm một giới hạn chiều cao cho chế độ xem tiêu đề.
Ian Warburton

14

Trong Swift :

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
}

Sử dụng phương pháp này cho iOS 7 trở lên sẽ kích hoạt cảnh báo thời gian chạy: "không có đường dẫn chỉ mục nào cho ô bảng được sử dụng lại". Để tránh lỗi này, liên kết
baskInEminence

11

Bạn cũng có thể chỉ cần tạo CHỈ một UIView trong Trình tạo giao diện và kéo và thả ImageView và UILabel (để làm cho nó trông giống như tiêu đề mong muốn của bạn) và sau đó sử dụng nó.

Khi UIView của bạn trông giống như cách bạn muốn, bạn có thể lập trình khởi tạo nó từ XIB và thêm vào UITableView của bạn. Nói cách khác, bạn không phải thiết kế bảng ENTIRE trong IB. Chỉ tiêu đề Xem (cách này cũng có thể được sử dụng lại trong các bảng khác)

Ví dụ: tôi có một UIView tùy chỉnh cho một trong các tiêu đề bảng của mình. Khung nhìn được quản lý bởi một tệp xib có tên "CustomHeaderView" và nó được tải vào tiêu đề bảng bằng mã sau trong lớp con UITableViewControll của tôi:

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

}

Không hiểu câu hỏi của bạn?
Priyam

2
Cái này sai. Anh ta chỉ muốn một tiêu đề bảng duy nhất KHÔNG phải là một tiêu đề phần. Hai điều rất khác nhau. Xin vui lòng đọc câu hỏi.
Charles Robertson
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.