具有固定节标题的UITableView


106

问候,我读到的默认行为UITableView是,当您滚动浏览各节时,将节标题行固定在表的顶部,直到下一节将previos节行从视图中推出为止。

我有一个UITableView内部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

@Eric标题与行一起滚动。当我滚动时,它们并没有停在表的顶部。我添加了用于生成表格视图的代码。它是UIViewController内的UITableView。
topwik

Answers:


304

仅当UITableViewStyle表的属性设置为时,标头才保持固定UITableViewStylePlain。如果将其设置为UITableViewStyleGrouped,则标题将随单元格向上滚动。


3
我的tableview样式是UITableViewStylePlain,但它还是随单元格向上滚动。
yudun1989

8
有两种可能的解释。一个重要的注意事项是,标头将仅对其部分中的单元格保持固定。因此,如果您在第0节中具有标题,则它对于第1节中的单元格将不会保持固定。另一个可能的解释是,您没有使用适当的样式初始化UITableView。建议您使用initWithStyle:UITableViewStylePlain,因为调用tableView.style = UITableViewStylePlain之类的命令将无法正常工作。
bachonk 2014年

UITableViewStyleGrouped使页眉/页脚与其他单元格固定,而UITableViewStylePlain使页眉/页脚到达表格视图的顶部/底部时,页眉/页脚“浮动”。
StoneLam

@bachonk我正在使用可伸缩的标题视图。我的风格是UITableViewStyleGrouped。我想在向上滚动时修复标题。如果我将其设置为UITableViewStylePlain,则标题将在屏幕中间固定,我想向下滚动标题,但是在向上滚动时,我希望将其固定在第一行..可以吗?
Gorib Developer

2

更改您的TableView样式:

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

根据UITableView的Apple文档:

UITableViewStylePlain-纯表格视图。滚动表格视图时,所有节的页眉或页脚都将显示为行内分隔符并浮动。

UITableViewStyleGrouped-一个表视图,其部分显示不同的行组。节的页眉和页脚不浮动。

希望这个小的改变对您有帮助。


2
这似乎与所要求的问题完全相反-应该Plain,而不是Grouped
CupawnTae

1

斯威夫特3.0

使用UITableViewDelegateUITableViewDataSource协议创建一个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

您还可以将tableview的bounces属性设置为NO。这将使节标题保持非浮动/静态状态,但同时也会丢失tableview的bounce属性。


0

使UITableView节标题不粘或不粘:

  1. 更改表格视图的样式-将其分组为不粘手,将其简单地写为粘手节标题-不要忘记:您可以从情节提要中进行编写而无需编写代码。(单击表格视图,然后从右侧/组件菜单更改其样式)

  2. 如果您有其他组件(例如自定义视图等),请检查表格视图的边距以创建适当的设计。(例如节的标题高度和索引路径中的单元格的高度,节)


-2

现在,您的tableview看起来像纯表格样式,但不要将buz设置表格样式设置为group浮动。

[_tableView setBackgroundView:nil];
_tableView.backgroundColor = [UIColor whiteColor];
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.