重叠UITableViewCell内容视图

我有这张桌子的细胞看起来像这样: UITabelViewCell
正如你所看到的,每个单元格的顶部边界应该与上面的单元格重叠。 现在,这个边界是背景的一部分(到目前为止,没有重叠)。

现在,我已经从背景中分离了边框,我的单元格创build代码如下所示:

#define QAImage(NAME) [[[UIImageView alloc] initWithImage:[UIImage imageNamed:NAME]] autorelease] - (UITableViewCell*) tableView:(UITableView*)table cellForRowAtIndexPath:(NSIndexPath*)index { UITableViewCell *cell = [table dequeueReusableCellWithIdentifier:@"Entry"]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Entry"] autorelease]; cell.backgroundView = QAImage(@"bg-cell.png"); cell.selectedBackgroundView = QAImage(@"bg-cell-sel.png"); cell.selectionStyle = UITableViewCellSelectionStyleGray; UIImageView *img = QAImage(@"disclosure.png"); img.highlightedImage = [UIImage imageNamed:@"disclosure-sel.png"]; cell.accessoryView = img; CGRect r = cell.frame; r.size.height = table.rowHeight; r.size.width = table.frame.size.width; cell.frame = r; r = cell.contentView.frame; r.origin = CGPointMake(13, 13); r.size.width -= 8 + img.frame.size.width; r.size.height -= 25; [cell.contentView addSubview:[[[TagView alloc] initWithFrame:r] autorelease]]; img = QAImage(@"cell-top.png"); img.highlightedImage = [UIImage imageNamed:@"cell-top-sel.png"]; img.opaque = NO; r = img.frame; r.origin = CGPointMake(0, 1 - r.size.height); // The (supposed) overlapping happens here. img.frame = r; cell.contentView.clipsToBounds = NO; [cell.contentView addSubview:img]; } // Here I set the title. (omitted) return cell; } 

问题是, 只有当我在表格中滚动时才会显示边框 ,否则它本身会被上面的单元格重叠。 (错误的方法。)

我已经在-tableView:willDisplayCell:forRowAtIndexPath:试过[cell setNeedsDisplay] -tableView:willDisplayCell:forRowAtIndexPath: cell-top.png每次请求一个单元格时都添加边框( cell-top.png )(这显然会导致多个绘图,看起来不好; cell-top.png仍然不能解决我的问题),并设置img.layer.zPosition = 2

我如何强制UIImageView始终保持最佳状态?

我的build议是将子类UITableView并重写layoutSubviews将可见的单元格视图放入你想要它们的z顺序像这样:

 - (void)layoutSubviews { [super layoutSubviews]; NSArray *sortedIndexPaths = [[self indexPathsForVisibleRows] sortedArrayUsingSelector:@selector(compare:)]; for (NSIndexPath *path in sortedIndexPaths) { UITableViewCell *cell = [self cellForRowAtIndexPath:path]; [self bringSubviewToFront:cell]; } } 

这可能太慢了,或者你可能需要改变bringSubviewToFront: sendSubviewToBack:但希望这给你一个方向来尝试。

编辑:现在的另一个select,如果你的目标是iOS 6,是使用UICollectionView,而不是内置支持zsorting。