UITableView不会浮动节标题

时间:2011-07-03 15:27:13

标签: objective-c ios cocoa-touch uitableview

是否可以不使用样式UITableView浮动UITableViewStylePlain的节标题?

我正在构建AcaniChat, an open-source version of iPhone's native Messages app,我想制作时间戳段标题,但它们不应该浮动。

我知道对于样式UITableViewStyleGrouped的表视图,节标题不会浮动,但这种样式看起来不像我想要的那样。我应该只使用那种风格并重新放置表格视图,使其看起来像我想要的那样吗?

如果我能弄明白如何制作https://stackoverflow.com/questions/6564712/nsfetchedresultscontroller-nsdate-section-headers,我可能会这样做。

4 个答案:

答案 0 :(得分:2)

UITableViewStyleGrouped的有趣之处在于tableView将样式添加到单元格而不是TableView。

将样式作为backgroundView添加到单元格中,作为一个名为UIGroupTableViewCellBackground的类,它根据单元格中单元格的位置处理不同的背景。

所以一个非常简单的解决方案是使用UITableViewStyleGrouped,将表的backgroundColor设置为clearColor,并简单地替换cellForRow中单元格的backgroundView:

cell.backgroundView = [[[UIView alloc] initWithFrame:cell.bounds] autorelease];

答案 1 :(得分:1)

我猜你要么必须使用两种自定义tableCells,要么完全跳过tableview并使用普通的scrollview来实现这种风格。

答案 2 :(得分:1)

现在可以通过两个快速简单的步骤完成(仅限iOS 6):

  1. 将您的UITableView样式更改为UITableViewStyleGrouped。 (您可以从Storyboard / NIB或通过代码执行此操作。)

  2. 接下来,将tableview的背景视图设置为空视图[在[em> viewDidAppear 等方法中,或者甚至在 cellForRow 方法中)(尽管我宁愿前者)]。

  3. yourTableView.backgroundView = [[UIView alloc] initWithFrame:listTableView.bounds];
    

    Voila,现在你有了你的桌面视图 - 但没有浮动部分标题。你的章节标题现在随着单元格一起滚动,你的凌乱的UI问题就解决了!

    这是有效的,因为UITableViewStyleGrouped现在似乎可以通过向普通UITableView添加背景视图来工作,但没有浮动节标题。 [注:在iOS 6早期,个人背景图像被添加到UITableViewCell中。]

    请尝试一下,让我知道它是怎么回事。 快乐编码:)

    编辑:对于iOS 7,只需将表格视图样式更改为“ UITableViewStyleGrouped ”,并将视图的色调颜色更改为“清除颜色”。

答案 3 :(得分:0)

您可以通过将标题放入各自的部分来实现此目的。首先加倍您的部分数量。然后对于偶数部分,将标题作为标题返回,将零作为行数返回。对于奇数部分,返回头部的nil。

假设您使用的是NSFetchedResultsController,它看起来像这样:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return self.fetchedResultsController.sections.count * 2;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    if ((section % 2) == 0)
    {
        section /= 2;

        id<NSFetchedResultsSectionInfo> sectionInfo = self.fetchedResults.sections[section];
        return sectionInfo.name;
    }
    else
    {
        return nil;
    }
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if ((section % 2) == 0)
    {
        return 0;
    }
    else
    {
        section /= 2;

        id<NSFetchedResultsSectionInfo> sectionInfo = self.fetchedResults.sections[section];
        return sectionInfo.numberOfObjects;
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ((indexPath.section % 2) == 0)
    {
        return nil;
    }
    else
    {
        indexPath = [NSIndexPath indexPathForRow:indexPath.row inSection:indexPath.section/2];
        id object = [self.fetchedResultsController objectAtIndexPath:indexPath];

        // configure your cell here.
    }
}