如何修改普通UITableView中“空”单元格的外观?

时间:2009-06-20 21:48:01

标签: iphone cocoa-touch uitableview

如果您有一行普通(未分组)UITableView,则屏幕的其余部分将填充空白或空单元格。你如何改变这些空白细胞的外观?首先,我认为他们会看到表视图中使用的单元格的外观,但似乎他们没有。

来自Cultured Code(Things)的人们在修改这些细胞方面做得很好,但我无法立即想出改变其外观的方法。

任何提示?

8 个答案:

答案 0 :(得分:21)

虽然它不是您想要的,但您也可以通过在表格上设置页脚视图来将其更改为仅显示空白区域(而不是空白单元格)。高度为0的UIView可以解决问题。

答案 1 :(得分:8)

基于samvermette's回答,但修改为直接使用背景图像而不是合成来自UITableViewCell子类的图像。 Sam的答案很好,但它的效果不如直接创建背景图像。

创建一个UIView子类 - 在本例中我称之为CustomTiledView - 并将以下代码添加到类中:

- (void)drawRect:(CGRect)rect {
UIImage *image = [UIImage imageNamed:@"tableview_empty_cell_image"];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextScaleCTM (context, 1, -1); 
CGContextDrawTiledImage(context, 
                        CGRectMake(0, 0, rect.size.width, image.size.height), 
                        [image CGImage]); 
}

将以下代码添加到tableviewcontroller:

- (CGFloat)tableView:(UITableView *)tableView 
           heightForFooterInSection:(NSInteger)section {
    // this can be any size, but it should be 1) multiple of the 
    // background image height so the last empty cell drawn
    // is not cut off, 2) tall enough that footer cells
    // cover the entire tableview height when the tableview
    // is empty, 3) tall enough that pulling up on an empty
    // tableview does not reveal the background.
        return BACKGROUND_IMAGE_HEIGHT * 9; // create 9 empty cells
}

- (UIView *)tableView:(UITableView *)tableView 
            viewForFooterInSection:(NSInteger)section {
    CustomTiledView *footerView = [[CustomTiledView alloc] init];
    return [footerView autorelease];
}

最后,您需要将tableview的底部内容插入设置为从-tableView:heightForFooterInsection:返回的值的负数。在此示例中,它将是-1*BACKGROUND_IMAGE_HEIGHT*9。您可以通过Interface Builder的Size Inspector设置底部内容,也可以通过设置tableviewcontroller的self.tableView.contentInset属性来设置。

干杯!

答案 2 :(得分:5)

我将一个~300px高的UIView子类设置到我的tableView页眉和页脚视图中,调整tableView插件以便它们补偿这些视图(将顶部和底部插入设置为-300px)。

我的UIView子类实现了drawRect方法,我在其中使用CGContextDrawTiledImage()重复绘制一个空UITableViewCell

- (void)drawRect:(CGRect)rect {

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(300, 46),NO,0.0);
    emptyCell = [[SWTableViewCell alloc] initWithFrame:CGRectZero];
    [emptyCell drawRect:CGRectMake(0, 0, 300, 46)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    [emptyCell release];
    UIGraphicsEndImageContext();

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextScaleCTM (context, 1, -1); // this prevents the image from getting drawn upside-down
    CGContextDrawTiledImage(context, CGRectMake(0, 0, 300, 46), [newImage CGImage]);
}

在我的情况下,我的tableviewcells是46px高,所以如果我想让UIView子类包含8个这样的空单元格,我需要使它高368px。

答案 3 :(得分:3)

来自http://jomnius.blogspot.com/2011/03/hide-uitableview-empty-cell-separator.html 简单的方法是定义该表没有单元格分隔线:

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

很难,如果你需要分隔线,那就是定义该表没有分隔线,并创建单元分隔线作为自定义UITableViewCell的一部分。显然,单元格的底部部分很可能使用非常薄的图形图像。请记住正确定义图像自动调整和模式。

另一种方法是定义一个空的UITableView的tableFooterView:

UIView *footer =
    [[UIView alloc] initWithFrame:CGRectZero];
self.myTable.tableFooterView = footer;
[footer release];

答案 4 :(得分:1)

如果您只是想在TableView中根本没有单元格时更改“空单元格”的高度:您需要设置UITableView的rowHeight属性({{1}的实现}对空TableViews没有影响)。如果TableView中有单元格并且您已实现tableView:heightForRowAtIndexPath:,则最后一行高度将用于空单元格。

答案 5 :(得分:0)

您可能必须创建一个UITableView的自定义子类,它使背景填充空白单元格。

- (void)drawRect:(CGRect)rect {
  [super drawRect: rect];

  // draw your background here if the rect intersects with the background area
}

答案 6 :(得分:0)

我认为使用UITableView tableView:viewForFooterInSection:方法的方法不适用于表为空的情况,即没有单元格。在这种情况下,您可以使用提议的Answerbot技术重新定位,将创建的UIView显式填充到表格的页脚视图中,如下所示:

    CGRect cellRect = CGRectMake(0, 0, table.bounds.size.width, table.bounds.size.height);
    CustomTiledView *footerView = [[[CustomTiledView alloc] initWithFrame:cellRect] autorelease];
    table.tableFooterView = footerView;

答案 7 :(得分:0)

快速 4.0

self.tableView.tableFooterView = UIView(frame: CGRect.zero)