TableView中最后一行之外的行高(如果项目数小于TableView可以一次显示的行数,那么只有视觉详细信息的空占位符行)始终与最后一行的高度相同。
是否可以在不借助添加虚拟最后一行的情况下更改此内容?
答案 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可以这样做。使用最后一行高度作为占位符行高度是合理的。
如果你坚持改变占位符行的高度,我知道,在单元格的末尾添加一个空的虚拟单元格是唯一的方法。
就像你做的那样。