更新:
我进行了更多的实验,以下解决方案依然有效,而且无需将单元格背景设置为透明,这涉及到移动被覆盖单元格的z顺序。这可以通过突出显示和选择其他单元格(通过相关回调函数)来完成,如果两个单元格的背景颜色不同,则此方法也会生效。解决方案如下(如果不需要,请忽略didHighlight
和didSelect
方法):
(请注意,“被覆盖行”是我们要保持可见的行,而在我的情况下,其内容稍微延伸到上面的行中,从而导致它被裁剪)
-(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;
}
}
注意:您还应该将内容的背景颜色设置为透明,否则它将采用单元格其余部分的背景颜色。因此当您将内容带到覆盖单元格的前面时,它将带走背景颜色并在其他单元格中留下不良的块(在我的情况下,我的唯一内容是detailTextLabel
和textLabel
):
// in cellForRowAtIndexPath:
[cell setBackgroundColor:[UIColor redColor]]
cell.detailTextLabel.backgroundColor = [UIColor clearColor]
cell.textLabel.backgroundColor = [UIColor clearColor]
我希望这对于其他尝试此方法的人有所帮助...
原文:
对我来说,解决方案是使用:
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
方法中这样做就足够了。