将大于cellHeight的子视图添加到UITableViewCell?

时间:2010-05-16 07:47:35

标签: iphone uitableview clipping

我正在尝试将子视图添加到UITableViewCell,而我正在使用的设计要求此特定子视图(图像)需要比实际的UITableViewCell更大,因此部分重叠其兄弟。

所以我设置了我的表格单元格,生成了我的图像并将其添加到单元格的contentView中:

// rowHeight for the UITableView is 45.0f

UIImage *image = [self createCellThumbnail: someImage];
UIImageView *thumbView = [[UIImageView alloc] initWithFrame: CGRectMake(150, -5, 55,55)];
thumbView.transform = CGAffineTransformMakeRotation(0.1f);
thumbView.image = image;

cell.clipsToBounds = NO;
cell.contentView.clipsToBounds = NO;

[cell.contentView addSubview: thumbView];

当图像“溢出”到其下方的单元格中时,图像的顶部始终被剪裁,如下所示:

img

有没有人知道我现在的做法是否可以做到?

或者我应该想办法在绘制完所有单元格后将这些图像绘制到UITableView上(这是一个不可滚动的tableview,这样就可以了,并且相当容易)。

更新:

还尝试添加以下内容,但无济于事:

cell.opaque = NO;
cell.contentView.opaque = NO;

cell.clearsContextBeforeDrawing = NO;
cell.contentView.clearsContextBeforeDrawing = NO;

cell.clipsToBounds = NO;    
cell.contentView.clipsToBounds = NO;

4 个答案:

答案 0 :(得分:15)

我似乎tableView从下到上渲染其单元格,因此一个单元格上方的单元格与该单元格重叠。为避免这种情况,您必须将所有单元格的backgroundColor设置为+[UIColor clearColor],这样您就不会看到这些重叠问题。

但在backgroundColor中将-tableView:cellForRowAtIndexPath:设置为清除没有任何意义。 UIKit在绘制之前会对单元格做很多事情,所以它会重置单元格的backgroundColor属性。

我们需要做的是将backgroundColor设置为以后的状态。幸运的是,我们可以这样实现-[UITableViewDelegate tableView:willDisplayCell:forRowAtIndexPath:]

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.backgroundColor = [UIColor clearColor];
}

现在我们在绘制单元格之前设置backgroundColor,结果证明它正常工作。

答案 1 :(得分:4)

<强>更新

所以我做了一些更多的实验,以下解决方案仍然有效,无需将单元格的背景设置为透明,这涉及移动覆盖单元格的z顺序。这适用于突出显示和选择其他单元格(通过相关的回调),以及两个单元格的背景是否是不同的颜色。解决方法如下(如果对您无关紧要,可以忽略didHighlightdidSelect方法):

(请注意,“被覆盖的行”是我们试图保持可见内容的那个。在我的情况下,它的内容稍微进入上面的行,这就是剪辑它)

-(void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section == 0 && indexPath.row == ROW_ABOVE_COVERED_ROW)
    {
        NSIndexPath * rowbelow = [NSIndexPath indexPathForRow:indexPath.row+1 inSection:indexPath.section];
        UITableViewCell* cell = [tableView cellForRowAtIndexPath:rowbelow];
        [cell.superview bringSubviewToFront:cell];
    }
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section == 0 && indexPath.row == ROW_ABOVE_COVERED_ROW)
    {
        NSIndexPath * rowbelow = [NSIndexPath indexPathForRow:indexPath.row+1 inSection:indexPath.section];
        UITableViewCell* cell = [tableView cellForRowAtIndexPath:rowbelow];
        [cell.superview bringSubviewToFront:cell];
    }
}

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.section == 0 && indexPath.row == COVERED_ROW)
    {
        [cell.superview bringSubviewToFront:cell];
        cell.contentView.superview.clipsToBounds = NO;
    }
}

注意:您还应该将内容的背景颜色设置为清除,或者它将采用单元格其余部分的bgcolor,因此当您设法将内容带到覆盖单元格的前面时,它将会用它来获取背景颜色并在另一个单元格中留下一个令人讨厌的块(在我的例子中,我唯一的内容是detailTextLabeltextLabel):

// in cellForRowAtIndexPath:
[cell setBackgroundColor:[UIColor redColor]]; //using red for debug
cell.detailTextLabel.backgroundColor = [UIColor clearColor];
cell.textLabel.backgroundColor = [UIColor clearColor];

我希望这对其他人有所帮助......

<强> ORIGINAL:

对我来说,解决方案是使用:

self.contentView.superview.clipsToBounds = NO;

我的细胞已经透明,但我的内容仍然被剪掉了。就我而言,我使用的是一个自定义单元格,可以在layoutSubviews中移动它的内容。因此我的自定义单元格的layoutSubviews如下:

-(void)layoutSubviews
{
    [super layoutSubviews];
    self.contentView.frame = CGRectOffset(self.contentView.frame, 0, -11);
    self.contentView.superview.clipsToBounds = NO;
}

我不知道如果上面的单元格是不透明的,或者如果单元格在按下时突出显示,这是否会起作用,这是否会掩盖我的内容。

但是, 没有 需要在viewWillDisplayCell回调方法中再次使单元格透明 - 在正常cellForRowAtIndexPath中执行此操作足够了

答案 2 :(得分:2)

我遇到了这个问题,我确保我的自定义tableviewcell的主背景检查了剪辑子视图,并解决了问题。这是从xib加载的自定义tableview单元格。不完全相同但情况类似。

答案 3 :(得分:1)

我昨天实际上有相反的情况,我创建了一个自定义表格单元格,由于某种原因,我得到了一个我不想要的溢出。我的解决方案是将以下代码添加到我的视图控制器类:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{  
    return 175;
}

当它与表格单元格的高度匹配时,没有重叠;当它太小时会有重叠。请注意,虽然我的行为非常快,所以我不确定这是一个非常好的主意。