UITableView dengan header bagian tetap

107

Salam, saya membaca bahwa perilaku default dari UITableViewadalah menyematkan baris tajuk bagian ke atas tabel saat Anda menggulir bagian-bagian tersebut sampai bagian berikutnya mendorong baris bagian sebelumnya keluar dari tampilan.

Saya memiliki bagian UITableViewdalam a UIViewControllerdan tampaknya tidak demikian.

Apakah itu hanya perilaku yang sebenarnya UITableViewController?

Berikut beberapa kode yang disederhanakan berdasarkan apa yang saya miliki. Saya akan menunjukkan UIControllerantarmuka dan setiap metode tampilan tabel yang telah saya terapkan untuk membuat tampilan tabel. Saya memiliki kelas sumber data pembantu yang membantu saya mengindeks objek saya untuk digunakan dengan tabel.

    @interface MyUIViewController ()<UITableViewDelegate, UITableViewDataSource>
        @property (nonatomic, readonly) UITableView *myTableView;
        @property (nonatomic, readonly) MyCustomHelperDataSource *helperDataSource;
    @end

    //when section data is set, get details for each section and reload table on success
    - (void)setSectionData:(NSArray *)sections {
        super.sectionData = sections; //this array drives the sections

        //get additional data for section details
        [[RestKitService sharedClient] getSectionDetailsForSection:someId 
        success:^(RKObjectRequestOperation *operation, RKMappingResult *details) {
            NSLog(@"Got section details data");
            _helperDataSource = [[MyCustomHelperDataSource alloc] initWithSections:sections andDetails:details.array];
            [myTableView reloadData];
        } failure:^(RKObjectRequestOperation *operation, NSError *error) {
            NSLog(@"Failed getting section details");
        }];
    }

    #pragma mark <UITableViewDataSource, UITableViewDelegate>

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        if (!_helperDataSource) return 0;
        return [_helperDataSource countSectionsWithDetails]; //number of section that have details rows, ignore any empty sections
    }

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        //get the section object for the current section int
        SectionObject *section = [_helperDataSource sectionObjectForSection:section];
        //return the number of details rows for the section object at this section
        return [_helperDataSource countOfSectionDetails:section.sectionId];
    }

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

        UITableViewCell * cell;

        NSString *CellIdentifier = @"SectionDetailCell";

        cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
            cell.textLabel.font = [UIFont systemFontOfSize:12.0f];
        }

        //get the detail object for this section
        SectionObject *section = [_helperDataSource sectionObjectForSection:indexPath.section]; 

        NSArray* detailsForSection = [_helperDataSource detailsForSection:section.sectionId] ;
        SectionDetail *sd = (SectionDetail*)[detailsForSection objectAtIndex:indexPath.row];

        cell.textLabel.text = sd.displayText;
        cell.detailTextLabel.text = sd.subText;
        cell.detailTextLabel.textColor = [UIColor blueTextColor];

        return cell;
    }

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 50.0f;
}

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

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger) section {
    //get the section object for the current section
    SectionObject *section = [_helperDataSource sectionObjectForSection:section]; 

    NSString *title = @"%@ (%d)";

    return [NSString stringWithFormat:title, section.name, [_helperDataSource countOfSectionDetails:section.sectionId]];
}

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    UIView *header = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 260, 0)];
    header.autoresizingMask = UIViewAutoresizingFlexibleWidth;

    header.backgroundColor = [UIColor darkBackgroundColor];

    SSLabel *label = [[SSLabel alloc] initWithFrame:CGRectMake(3, 3, 260, 24)];
    label.font = [UIFont boldSystemFontOfSize:10.0f];
    label.verticalTextAlignment = SSLabelVerticalTextAlignmentMiddle;
    label.backgroundColor = [UIColor clearColor];
    label.text = [self tableView:tableView titleForHeaderInSection:section];
    label.textColor = [UIColor whiteColor];
    label.shadowColor = [UIColor darkGrayColor];
    label.shadowOffset = CGSizeMake(1.0, 1.0);
    [header addSubview:label];

    return header;
}
topwik
sumber
Seharusnya itu berhasil. Tunjukkan beberapa kode.
Matthias Bauch
Itu adalah cara yang sangat bagus untuk menggunakan UITableView, dan harus bekerja dengan header. Apa yang tidak dilakukan header dalam kasus Anda?
Eric
@Eric header sedang bergulir dengan baris. Mereka tidak berhenti di atas tabel saat saya menggulir. Saya telah menambahkan kode yang saya gunakan untuk menghasilkan tampilan tabel saya. Ini adalah UITableView di dalam UIViewController.
topwik

Jawaban:

305

Header hanya tetap jika UITableViewStyleproperti tabel diatur ke UITableViewStylePlain. Jika Anda telah mengaturnya ke UITableViewStyleGrouped, header akan menggulir ke atas dengan sel.

bachonk.dll
sumber
3
gaya tampilan tabel saya adalah UITableViewStylePlain, tetapi juga menggulir ke atas dengan sel.
yudun1989
8
Ada beberapa kemungkinan penjelasan untuk ini. Satu catatan penting adalah bahwa header hanya akan tetap untuk sel dalam bagiannya. Jadi, jika Anda memiliki header di bagian 0, itu tidak akan tetap untuk sel di bagian 1. Penjelasan lain yang mungkin adalah Anda tidak menginisialisasi UITableView Anda dengan gaya yang tepat. Anda disarankan untuk menggunakan initWithStyle:UITableViewStylePlain, karena memanggil sesuatu seperti tableView.style = UITableViewStylePlain tidak akan berfungsi.
bachonk
UITableViewStyleGrouped membuat header / footer diperbaiki dengan sel lain, sementara UITableViewStylePlain membuat header / footer "mengambang" saat header / footer mencapai bagian atas / bawah tampilan tabel.
StoneLam
@bachonk saya menggunakan tampilan tajuk yang dapat direntangkan. dan gaya saya adalah UITableViewStyleGrouped. saya ingin memperbaiki header saat menggulir ke atas. jika saya membuatnya UITableViewStylePlain maka tajuknya diperbaiki di tengah layar, saya ingin menggulirkan tajuk ke bawah, tetapi ketika menggulir ke atas saya ingin memperbaikinya di baris pertama .. mungkinkah?
Pengembang Gorib
3

Ubah Gaya TableView Anda:

self.tableview = [[UITableView alokasi] initwithFrame: gaya bingkai: UITableViewStyleGrouped];

Sesuai dokumentasi apple untuk UITableView:

UITableViewStylePlain- Tampilan tabel biasa. Header atau footer bagian apa pun ditampilkan sebagai pemisah sebaris dan mengambang saat tampilan tabel di-scroll.

UITableViewStyleGrouped- Tampilan tabel yang bagiannya menampilkan grup baris yang berbeda. Header dan footer bagian tidak mengambang.

Semoga perubahan kecil ini akan membantu Anda ..

Aks
sumber
2
ini tampaknya persis kebalikan dari pertanyaan yang diminta - seharusnya Plain, bukanGrouped
CupawnTae
1

Swift 3.0.0

Buat ViewController dengan UITableViewDelegate dan UITableViewDataSource protokol. Kemudian buat tableView di dalamnya, deklarasikan gayanya menjadi UITableViewStyle.grouped . Ini akan memperbaiki header.

lazy var tableView: UITableView = {
    let view = UITableView(frame: UIScreen.main.bounds, style: UITableViewStyle.grouped)
    view.delegate = self
    view.dataSource = self
    view.separatorStyle = .none
    return view
}()
Nursultan Askarbekuly
sumber
0

Anda juga dapat menyetel properti pantulan tampilan tabel ke TIDAK. Ini akan membuat header bagian tidak mengambang / statis, tetapi kemudian Anda juga kehilangan properti pantulan dari tableview.

kevinl
sumber
0

untuk membuat header bagian UITableView tidak lengket atau lengket:

  1. ubah gaya tampilan tabel - buat dikelompokkan agar tidak lengket & buat polos untuk header bagian yang lengket - jangan lupa: Anda dapat melakukannya dari storyboard tanpa menulis kode. (klik pada tampilan tabel Anda dan ubah gayanya dari sisi kanan / menu komponen)

  2. jika Anda memiliki komponen tambahan seperti tampilan kustom atau lain-lain, harap periksa margin tampilan tabel untuk membuat desain yang sesuai. (seperti tinggi header untuk bagian & tinggi sel di jalur indeks, bagian)

Burcu Kutluay
sumber
-2

Sekarang tampilan tabel Anda terlihat seperti gaya tabel biasa tetapi tidak mengambang, tetapi gaya tabel pengaturan diatur ke grup.

[_tableView setBackgroundView:nil];
_tableView.backgroundColor = [UIColor whiteColor];
Ravi Kumar
sumber