分组UITableView中节标题和第一个单元格之间的透明像素行

9
正如标题所述,我有一个问题,即我无法摆脱一行透明像素。
我附上了一张图片,因为它价值千言万语。

问题在于区段页脚(我也使用了自定义视图),而该问题不存在于区段页眉中。我已经反复检查,确保返回了正确的区段高度大小。
有什么想法吗?
编辑: 我添加了一个测试项目,这样你就可以玩了。紫色代表背景颜色。白色矩形是标题/页脚,浅灰色是一些虚拟单元格。该问题在项目中清晰可见。 TransparentRowBug XCode project 你还会看到我使用了很多透明颜色。不幸的是,为了隐藏问题而更改颜色对我来说不是可行的解决方案。
随意试试(或更多)!
非常感谢!
编辑2: 经过进一步调查,我得出结论,像素行来自tableview分隔符。在测试项目中,我将separatorColor设置为clearColor。如果我将其更改为另一种颜色,则会在新颜色中准确地获得该行像素。即使我将分隔符样式设置为none,它似乎对分组表没有影响。

你尝试过返回比你需要的高度少10像素吗? - Julian
是的。行为有些不确定。标题视图将出现裁剪,但透明行有时仍会存在。如果我滚动离开并回来,我会得到一个白色行、黑色行(可能是从裁剪区域中获取的)或透明行。我甚至尝试将标题视图中的UIImage扩展到视图之外,并删除“剪辑子视图”标志,以便我可以在某种程度上覆盖该空间。没有成功 :( - Andrei Stanescu
5个回答

11

经过将近两天的测试(和掉头发),我终于弄明白了这个问题。

如我在上面的评论中所说,仅仅在“heightForHeader”方法中返回一个较小的高度是行不通的。要让它工作,你需要将你期望的标题视图插入到一个大小完全相同的虚拟/容器视图中,然后将该容器视图作为表格的标题。

然后,当你返回一个较小的标题尺寸时,它就会神奇地(对我来说确实是魔法)成功地覆盖那一行讨厌的像素。

顺便说一下,我得出结论认为这一行像素是由于单元格分隔线造成的。

如果有人感兴趣,我可以再次上传可工作的测试项目。


2
我曾经遇到过完全相同的问题(这绝对是iOS的一个bug),只需将我的header视图放在一个虚拟UIView中返回即可解决问题,而无需返回较小尺寸的header。在viewForHeaderInSection的末尾,我有以下代码:UIView *view = [[UIView alloc] initWithFrame:[headerView frame]]; [view addSubview:headerView]; return view; - mluisbrown
1
在我的情况下,我正在使用storyboards,并且我返回的标题视图实际上是在IB中创建的原型UITableViewCell。我怀疑问题只会发生在标题视图的类型为UITableViewCell的情况下,因此我尝试只返回一个空白(但着色)的UIView,果然,线条消失了。因此,在UITableViewCell内部包装一个UIView可以解决这个问题。如果标题视图的类型是UITableViewCell,那么Apple必须做一些略微不同的事情,导致分隔符出现。 - mluisbrown
1
该方法要求一个UIView,而UITableViewCell是UIView的子类。我解决了这个问题,只需返回UITableViewCell.contentView即可。 - Alberto Scampini

0

在标题视图和第一行之间添加分隔符:在section delegate方法的Header视图中添加一个子视图self.separator //@property (nonatomic, strong) UIImageView *separator;

- (CGFloat)tableView:(UITableView *)tableView
heightForHeaderInSection:(NSInteger)section {

return 41; 
}


- (UIView *)tableView:(UITableView *)tableView
viewForHeaderInSection:(NSInteger)section {

self.headerView = [[UIView alloc] init];
self.headerView.backgroundColor = [UIUtils colorForRGBColor:TIMESHEET_HEADERVIEW_COLOR];

self.separator = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"seperator.png"]];
self.separator.frame = CGRectMake(0,40,self.view.frame.size.width,1);
[self.headerView addSubview:self.separator];
return self.headerView;

}

0

我也遇到了这个问题。我有一个带分组的UITableView。在第一节标题和第一个单元格之间,有一个1点(2 Retina像素)的间隙,背景透过来了。

如果背景单元格颜色是统一的,那么您可以将UITableView的backgroundColor分配为隐藏此间隙。

在我的情况下,backgroundColor/backgroundView用于其他单元格上的非滚动图案背景。 mluisbrown提出的解决方案完美地解决了这个问题。我想再次强调这个解决方案:

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
   UIView* topTabView = /* initialized elsewhere */;
   CGRect sectionHeaderSize = CGRectMake(0, 0, 320, 46);
   UIView* wrapperView = [[UIView alloc] initWithFrame:sectionHeaderSize];
   topTabView.frame = sectionHeaderSize;
   [wrapperView addSubview:topTabView];
   return wrapperView;
}

0

我不确定是否理解你的问题,但是两天前我发现可以通过在tableView中减少默认区域间距来实现...

方法是让heightForHeader返回一个负值!虽然有点hack,但是...确实有效。

希望这能帮到你...


0

分组的UITableView将头部、单元格和尾部视图作为一个整体。因此,白色透明视图是尾部视图,可以通过减小尾部高度来处理,如屏幕截图所示。希望它能够起作用。 祝你好运 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接