固定セクションヘッダーのあるUITableView


106

UITableView挨拶します。次のセクションで前のセクションの行が表示されなくなるまでセクションをスクロールすると、デフォルトの動作ではセクションのヘッダー行がテーブルの上部に固定されます。

私はUITableView内部a を持っていますがUIViewController、これはそうではないようです。

それは単にデフォルトの動作UITableViewControllerですか?

ここに私が持っているものに基づいたいくつかの単純化されたコードがあります。UIControllerテーブルビューを作成するために実装したインターフェイスと各テーブルビューメソッドを示します。テーブルで使用するためにオブジェクトにインデックスを付けるのに役立つヘルパーデータソースクラスがあります。

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

うまくいくはずです。コードを表示します。
Matthias Bauch 2013

これはUITableViewを使用するための完全に優れた方法であり、ヘッダーで動作するはずです。あなたの場合、ヘッダーは何をしていませんか?
エリック

@Ericヘッダーは行とともにスクロールします。スクロールしても、テーブルの上部で止まらない。テーブルビューの生成に使用しているコードを追加しました。UIViewController内のUITableViewです。
topwik 2013

回答:


304

ヘッダーUITableViewStyleは、テーブルのプロパティがに設定されてUITableViewStylePlainいる場合にのみ固定されます。に設定している場合UITableViewStyleGrouped、ヘッダーはセルとともに上にスクロールします。


3
テーブルビューのスタイルはUITableViewStylePlainですが、セルとともに上にスクロールします。
yudun1989、2014年

8
これにはいくつかの説明が考えられます。重要な注意点の1つは、ヘッダーはそのセクション内のセルに対してのみ固定されたままになることです。したがって、セクション0にヘッダーがある場合、セクション1のセルに対しては固定されたままにはなりません。別の考えられる説明は、適切なスタイルでUITableViewを初期化していないことです。initWithStyle:UITableViewStylePlaintableView.style = UITableViewStylePlainのような呼び出しは機能しないため、を使用することをお勧めします。
bachonk 14年

UITableViewStyleGroupedはヘッダー/フッターを他のセルで固定しますが、UITableViewStylePlainはヘッダー/フッターがテーブルビューの上部/下部に達するとヘッダー/フッターを「フロート」にします。
StoneLam 2017

@bachonk私はストレッチ可能なヘッダービューを使用しています。私のスタイルはUITableViewStyleGroupedです。上にスクロールするときにヘッダーを修正したい。UITableViewStylePlainにすると、ヘッダーが画面の中央で修正されます。ヘッダーを下にスクロールしたいのですが、上にスクロールすると最初の行で修正したいのですが、可能ですか?
Gorib開発者2018

2

TableViewスタイルを変更します。

self.tableview = [[UITableView alloc] initwithFrame:frame style:UITableViewStyleGrouped];

UITableViewのアップルのドキュメントに従って:

UITableViewStylePlain-プレーンテーブルビュー。セクションヘッダーまたはフッターはインラインセパレータとして表示され、テーブルビューがスクロールされるとフロートします。

UITableViewStyleGrouped-セクションが異なる行のグループを表示するテーブルビュー。セクションのヘッダーとフッターはフロートしません。

この小さな変更がお役に立てば幸いです。


2
この質問は、要求されたものの正反対のように見える-それはあるべきPlainではないGrouped
CupawnTae

1

Swift 3.0

UITableViewDelegateおよびUITableViewDataSourceプロトコルを使用してViewControllerを作成します。次に、その内部にtableViewを作成し、そのスタイルをUITableViewStyle.groupedとして宣言します。これでヘッダーが修正されます。

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

テーブルビューのバウンスプロパティをNOに設定することもできます。これにより、セクションヘッダーは非フローティング/静的に保たれますが、テーブルビューのバウンスプロパティも失われます。


0

UITableViewセクションヘッダーをスティッキーまたはスティッキーにしない:

  1. テーブルビューのスタイルを変更します-スティッキーではなくグループ化し、スティッキーセクションヘッダーではプレーンにします-忘れないでください。コードを記述せずにストーリーボードから実行できます。(テーブルビューをクリックして、右側のサイド/コンポーネントメニューからスタイルに変更します)

  2. カスタムビューなどの追加コンポーネントがある場合は、テーブルビューのマージンを確認して適切なデザインを作成してください。(セクションのヘッダーの高さ、インデックスパス、セクションのセルの高さなど)


-2

これで、テーブルビューはプレーンなテーブルスタイルのように見えますが、グループに設定されたテーブルスタイルをフロートしないでください。

[_tableView setBackgroundView:nil];
_tableView.backgroundColor = [UIColor whiteColor];
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.