Sabit bölüm başlıklarına sahip UITableView


107

Selamlar, okuyorum UITableView, bir sonraki bölüm önceki bölüm satırını görünümün dışına itene kadar bölümleri kaydırırken bölüm başlık satırlarını tablonun üst kısmına sabitlemenin varsayılan davranışının olduğunu okuyorum .

Bende bir UITableViewiç a var UIViewControllerve durum böyle görünmüyor.

Bu sadece varsayılan davranış UITableViewControllermı?

İşte sahip olduğum şeye dayalı bazı basitleştirilmiş kod. UIControllerArayüzü ve tablo görünümünü oluşturmak için uyguladığım her tablo görünümü yöntemini göstereceğim . Tablo ile kullanmak için nesnelerimi dizine eklememe yardımcı olan yardımcı bir veri kaynağı sınıfım var.

    @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;
}

Bu çalışmalı. Biraz kod gösterin.
Matthias Bauch

Bu, bir UITableView kullanmanın tamamen iyi bir yoludur ve başlıklarla çalışması gerekir. Başlıklar sizin durumunuzda ne yapmıyor?
Eric

@Eric, başlıklar satırlarla birlikte kayıyor. Ben kaydırırken masanın tepesinde durmuyorlar. Tablo görünümümü oluşturmak için kullandığım kodu ekledim. Bir UIViewController içindeki bir UITableView.
topwik

Yanıtlar:


305

Başlıklar yalnızca UITableViewStyletablonun özelliği olarak ayarlandığında sabit kalır UITableViewStylePlain. Ayarladıysanız UITableViewStyleGrouped, başlıklar hücrelerle birlikte yukarı kayacaktır.


3
benim tablo görünüm stilim UITableViewStylePlain, ancak hücrelerle birlikte yukarı kaydırılıyor.
yudun1989

8
Bunun birkaç olası açıklaması var. Önemli bir not, başlıkların yalnızca kendi bölümündeki hücreler için sabit kalacağıdır. Dolayısıyla, bölüm 0'da bir başlığınız varsa, bölüm 1'deki hücreler için sabit kalmayacaktır. Bir başka olası açıklama, UITableView'unuzu uygun stille başlatmadığınızdır. initWithStyle:UITableViewStylePlainTableView.style = UITableViewStylePlain gibi bir şeyi çağırmak işe yaramayacağından kullanmanız önerilir .
bachonk

UITableViewStyleGrouped, üstbilgi / altbilgiyi diğer hücrelerle sabitlerken, UITableViewStylePlain üstbilgi / altbilgi tablo görünümünün üstüne / altına ulaştığında üstbilgi / altbilgiyi "kayar" yapar.
StoneLam

@bachonk uzatılabilir bir başlık görünümü kullanıyorum. ve benim tarzım UITableViewStyleGrouped. Yukarı kaydırırken başlığı düzeltmek istiyorum. UITableViewStylePlain yaparsam, başlık ekranın ortasında sabitleniyor, başlığı aşağı kaydırmak istiyorum, ancak yukarı kaydırırken ilk satırda düzeltmesini istiyorum .. mümkün olabilir mi?
Gorib Developer

3

TableView Stilinizi değiştirin:

self.tableview = [[UITableView ayırma] initwithFrame: çerçeve stili: UITableViewStyleGrouped];

UITableView için Apple belgelerine göre:

UITableViewStylePlain- Düz bir tablo görünümü. Herhangi bir bölüm üstbilgisi veya altbilgisi satır içi ayırıcılar olarak görüntülenir ve tablo görünümü kaydırıldığında yüzer.

UITableViewStyleGrouped- Bölümleri farklı satır grupları sunan bir tablo görünümü. Bölüm üstbilgileri ve altbilgileri kaymaz.

Umarım bu küçük değişiklik size yardımcı olur ..


2
bu sorunun tam tersi gibi görünüyor - öyle olmalı Plain, olmamalıGrouped
CupawnTae

1

Swift 3.0

Bir oluşturun ViewController ile UITableViewDelegate ve UITableViewDataSource protokolleri. Ardından, stilini UITableViewStyle.grouped olarak bildiren bir tableView oluşturun . Bu, başlıkları düzeltir.

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
}()

0

Ayrıca tableview'un bounces özelliğini NO olarak da ayarlayabilirsiniz. Bu, bölüm üstbilgilerini kayan / statik olmayan tutacaktır, ancak daha sonra tablo görünümünün sıçrama özelliğini de kaybedersiniz.


0

UITableView bölümleri başlığının yapışkan veya yapışkan olmaması için:

  1. tablo görünümünün stilini değiştirin - yapışkan olmamak için gruplandırın ve yapışkan bölüm başlıkları için düz hale getirin - unutmayın: bunu film şeridinden kod yazmadan yapabilirsiniz. (tablo görünümünüze tıklayın ve sağ taraftaki / bileşen menüsünden stilini değiştirin)

  2. Özel görünümler vb. gibi ekstra bileşenleriniz varsa, lütfen uygun tasarımı oluşturmak için tablo görünümünün kenar boşluklarını kontrol edin. (bölümler için başlık yüksekliği ve dizin yolundaki hücre yüksekliği, bölümler gibi)


-2

Artık masa görünümünüz düz masa stiline benziyor, ancak grup olarak ayarlanan buz ayar masası stilini yüzdürmeyin.

[_tableView setBackgroundView:nil];
_tableView.backgroundColor = [UIColor whiteColor];
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.