Menambahkan iOS UITableView HeaderView (bukan tajuk bagian)

167

Saya ingin menambahkan tajuk tabel (bukan tajuk bagian) seperti di aplikasi kontak, misalnya: masukkan deskripsi gambar di sini

persis seperti itu - label di sebelah gambar di atas tabel.

Saya ingin semua tampilan dapat digulir sehingga saya tidak dapat menempatkannya di luar tabel.

Bagaimana saya bisa melakukan itu?

Assaf b
sumber

Jawaban:

245

UITableViewmemiliki tableHeaderViewproperti. Tetapkan itu ke tampilan apa pun yang Anda inginkan di sana.

Gunakan yang baru UIViewsebagai wadah, tambahkan label teks dan tampilan gambar ke yang baru UIView, kemudian atur tableHeaderViewke tampilan baru.

Misalnya, dalam 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];
     // ...
} 
peterjb
sumber
Bagus! Terima kasih, ini berhasil. Apakah ada properti membuat sel tampilan tab tumbuh sebesar teks di dalamnya?
Assaf b
Untuk melakukan itu, Anda harus dapat menghitung tinggi sel yang diberikan string, dan meneruskan nilai itu untuk heightForRowAtIndexPath. Anda dapat menggunakan metode NSString sizeWithFont: constrainedToSize: berfungsi untuk mengetahui ketinggian teks saat dibatasi ke ukuran.
Markus
Tambahkan setelah tata letak, atau ukurannya tidak sesuai keinginan Anda. Dan viewDidLoad adalah tempat yang bagus.
BollMose
Apakah ini praktik yang baik untuk mengatur geometri tampilan selama dalam fase viewDidLoad?
Nandish A
1
ok jika Anda mengatur tampilan header di sumber tabel sepertinya berfungsi, pastikan untuk mengatur ketinggian juga: contoh:public override UIView GetViewForHeader(UITableView tableView, nint section) { return headerView; } public override nfloat GetHeightForHeader(UITableView tableView, nint section) { return headerView.Frame.Height; }
panthor314
193

Anda dapat melakukannya dengan cukup mudah di Interface Builder. Cukup buat tampilan dengan tabel dan letakkan tampilan lain di atas meja. Ini akan menjadi tampilan header tabel. Tambahkan label dan gambar Anda ke tampilan itu. Lihat gambar di bawah untuk hierarki tampilan. Lihat Hierarki dalam Pembuat Antarmuka

Kirby Todd
sumber
12
Saya lebih suka jawaban ini karena mengapa menulis kode ketika saya dapat mengaturnya dengan rapi dan memposisikannya di IB
Besi
1
Terima kasih luar biasa untuk petunjuknya. BTW Anda tidak perlu tampilan gulir di header Anda jika ada orang lain yang bertanya-tanya atau mencoba itu. Ia menggunakan ScrollView UITableView untuk Header Anda, karena Header secara teknis merupakan bagian dari UITableView
Rob R.
2
Layak untuk menyebutkan cara kerjanya di StoryBoard editor sekarang: stackoverflow.com/q/7841167/926907
Dmitry Zaytsev
Jangan gunakan pena untuk ini. Butuh waktu lebih lama untuk memuat. Tulis dalam kode. Agar dapat digunakan kembali, buat kelas khusus & instantiate ...
Charles Robertson
1
Itu tidak akan membiarkan saya menambahkan batasan ketinggian ke tampilan header.
Ian Warburton
14

Dalam 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
}
Raja-Penyihir
sumber
Menggunakan pendekatan ini untuk iOS 7 atau lebih tinggi akan memicu peringatan runtime: "tidak ada jalur indeks untuk sel tabel yang digunakan kembali". Untuk menghindari kesalahan ini, tautan
baskInEminence
11

Anda juga bisa membuat HANYA UIView di Interface builder dan drag & drop ImageView dan UILabel (untuk membuatnya tampak seperti header yang Anda inginkan) dan kemudian gunakan itu.

Setelah UIView Anda terlihat seperti yang Anda inginkan juga, Anda dapat secara inisialisasi memprogramnya dari XIB dan menambahkannya ke UITableView Anda. Dengan kata lain, Anda tidak perlu mendesain tabel SELURUH DI IB. Hanya headerView (dengan cara ini tampilan header dapat digunakan kembali di tabel lain juga)

Misalnya saya punya UIView khusus untuk salah satu header tabel saya. Tampilan dikelola oleh file xib yang disebut "CustomHeaderView" dan dimuat ke header tabel menggunakan kode berikut di subkelas UITableViewController saya:

-(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;
}
iansari
sumber
-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
sumber
Tidak mengerti pertanyaan Anda?
Priyam
2
Ini salah. Dia hanya ingin header tabel tunggal BUKAN header bagian. Dua hal itu sangat berbeda. Silakan baca pertanyaannya.
Charles Robertson