重叠 UITableViewCell 内容视图

Overlapping UITableViewCell content views(重叠 UITableViewCell 内容视图)

本文介绍了重叠 UITableViewCell 内容视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一张表格,其单元格如下所示:
如您所见,每个单元格的顶部边框都应该与上面的单元格重叠.现在,这个边框是背景的一部分(目前没有重叠).

I have this table whose cells look like this:
As you can see, the top border of every cell is supposed to overlap with the cell above. Right now, this border is part of the background (no overlapping so far).

现在,我已将边框与背景分开,我的单元格创建代码如下所示:

Now, I've separated the border from the background and my cell creation code looks like this:

#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;
}

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

The problem is, the border is only shown when I'm scrolling up in the table, else it is itself overlapped by the cell above it. (The wrong way around.)

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

I've tried [cell setNeedsDisplay] in -tableView:willDisplayCell:forRowAtIndexPath:, adding the border (cell-top.png) every time a cell is requested (which obviously leads to multiple drawing and doesn't look good; regardless, it still doesn't solve my problem) and setting img.layer.zPosition = 2.

如何强制 UIImageView 始终保持在顶部?

How can I force that UIImageView to stay on top all the time?

推荐答案

我的建议是继承 UITableView 并覆盖 layoutSubviews 以将可见单元格视图放入您希望它们的 z 顺序中,如下所示:

My suggestion would be to subclass UITableView and override layoutSubviews to put the visible cell views into the z-order you want them to be in like this:

- (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:,但希望这能给您一个尝试的方向.

This might be too slow, or you might need to change bringSubviewToFront: to sendSubviewToBack:, but hopefully that gives you a direction to try out.

如果您的目标是 iOS 6,现在的另一个选择是使用 UICollectionView,它内置了对 z-ordering 的支持.

Another option now, if you're targeting iOS 6, is to use a UICollectionView instead, which has built-in support for z-ordering.

这篇关于重叠 UITableViewCell 内容视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:重叠 UITableViewCell 内容视图

基础教程推荐