是否可以在不创建虚拟行的情况下更改UITableView中占位符行的高度?

时间:2011-12-06 00:09:49

标签: iphone objective-c ios ipad

TableView中最后一行之外的行高(如果项目数小于TableView可以一次显示的行数,那么只有视觉详细信息的空占位符行)始终与最后一行的高度相同。

是否可以在不借助添加虚拟最后一行的情况下更改此内容?

Screenshot

2 个答案:

答案 0 :(得分:1)

私有UITableView实例方法_spacingForExtraSeparators返回占位符行的高度。如果您没有为App Store编写应用程序,请覆盖它。它返回一个CGFloat。

这是一种与App Store兼容的不同方法(据我所知),可能比创建虚拟行更容易。

UITableView发送了layoutSubviews消息。每当它添加,删除或重新排列单元格时,无论何时滚动(也可能是其他时间),它都会执行此操作。所以让我们覆盖layoutSubviews来绘制一个从表视图的最后一节的底部边缘开始的视图。视图将填充一个重复的模式,看起来像占位符单元格,具有您定义的高度。

创建UITableView的子类。为您的子类提供UIView *_bottomView实例变量。我们需要覆盖layoutSubviews,因此我们会在该方法中懒惰地初始化_bottomView

@implementation MyTableView
{
    UIView *_bottomView;
}

覆盖layoutSubviews。您在layoutSubviews中执行的第一件事就是致电[super layoutSubviews],这样您就可以继续行事UITableView

- (void)layoutSubviews
{
    [super layoutSubviews];

你接下来要做的就是懒惰地初始化_bottomView

    if (!_bottomView) {

您需要一个模式来填充_bottomView,它需要看起来像占位符单元格。创建一个1像素宽的图像上下文,并且您想要一个占位符单元格。用白色填充上下文,并在底部绘制分隔线(像素,真的)。从上下文中获取图像。

        UIGraphicsBeginImageContextWithOptions(CGSizeMake(1, placeholderHeight), YES, 0);
        [[UIColor whiteColor] setFill];
        UIRectFill(CGRectMake(0, 0, 1, placeholderHeight));
        [self.separatorColor setFill];
        UIRectFill(CGRectMake(0, placeholderHeight - 1, 1, 1));
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

接下来,创建_bottomView,将其背景“颜色”设置为该图像作为重复模式,并将其作为子视图添加到自己。

        _bottomView = [[UIView alloc] initWithFrame:CGRectZero];
        _bottomView.opaque = YES;
        _bottomView.backgroundColor = [UIColor colorWithPatternImage:image];
        [self addSubview:_bottomView];
    } // end of if-block

最后,找到你上一节的矩形。使用该矩形来计算从最后一节底部开始的_bottomView的框架,高度很高(两倍于你自己的高度绰绰有余),并且与上一部分的矩形一样宽。

    int lastSectionIndex = [self.dataSource numberOfSectionsInTableView:self] - 1;
    if (lastSectionIndex < 0)
        lastSectionIndex = 0;
    CGRect lastSectionRect = [self rectForSection:lastSectionIndex];
    CGRect bottomViewFrame = CGRectMake(lastSectionRect.origin.x, CGRectGetMaxY(lastSectionRect), lastSectionRect.size.width, self.bounds.size.height * 2);
    _bottomView.frame = bottomViewFrame;

最后,请确保_bottomView是您最前面的子视图,以便它会覆盖UITableView的占位符单元格。

    [self bringSubviewToFront:_bottomView];
} // end of layoutSubviews

结束。

@end

答案 1 :(得分:0)

我认为没有公共API可以这样做。使用最后一行高度作为占位符行高度是合理的。

如果你坚持改变占位符行的高度,我知道,在单元格的末尾添加一个空的虚拟单元格是唯一的方法。

就像你做的那样。