【问题标题】:UITableViewCell shadow disappears after scrollUITableViewCell 滚动后阴影消失
【发布时间】:2023-11-27 16:08:01
【问题描述】:

我有子类 UITableViewCell 类以在我的单元格下方添加阴影。当 TableView 出现在屏幕上时,阴影被正确添加。但是,当我向下滚动 tableview 时,带有阴影的单元格隐藏在屏幕上方,阴影消失了。

- (void)layoutSubviews {
    [super layoutSubviews];
    if (self.shouldAddShadow) {
        self.layer.shadowOpacity = 0.5;
        self.layer.shadowRadius = 1.5;
        self.layer.shadowOffset = CGSizeMake(0, 3);
        self.layer.shadowColor = [[[UIColor appDarkDividerColor] colorWithAlphaComponent:0.9] CGColor];
        [self setClipsToBounds:NO];
        [self.layer setMasksToBounds:NO];
        CGRect shadowFrame = self.layer.bounds;
        CGPathRef shadowPath = [UIBezierPath bezierPathWithRect:shadowFrame].CGPath;
        self.layer.shadowPath = shadowPath;
    }
}

忘了提一下,我有带静态单元格的表格视图;所以没有调用 prepareForReuse 。我的单元格有插座,因此我还尝试在 scrollViewDidScroll: 方法中为我的单元格设置阴影。即使这对我没有帮助

【问题讨论】:

  • 我的猜测是,当单元格被重用时,self.shouldAddShadow 可能是 FALSE。您在代码中的哪个位置将该标志设置为 TRUE/FALSE?
  • 这可能与cell的复用机制有关。我可能会建议两件事。首先 - 在 [super layoutSubviews] 之后添加 NSLog(@"self.shouldAddShadow = %@", self.shouldAddShadow ? @"YES" : @"NO") 消息;看看发生这种情况时你的旗帜发生了什么。第二 - 也许让这个影子事物成为一个方法并在你配置你的单元格时调用它?
  • 忘了提,我有带静态单元格的表格视图;所以没有调用 prepareForReuse 。我的单元格有插座,因此我还尝试在 scrollViewDidScroll: 方法中为我的单元格设置阴影。即使这对我没有帮助
  • 您可能需要在滚动时使用 [cell setNeedsLayout] 强制布局。这可能就足够了,或者您可能需要调用 [cell layoutIfNeeded] 来强制布局。你可以把这个调用放在委托方法tableView:willDisplayCell:forRowAtIndexPath中。
  • FWIW,我现在遇到了完全相同的问题,到目前为止还无法解决。

标签: ios objective-c uitableview shadow


【解决方案1】:

我刚遇到这个问题。最后我找到了让它工作的方法。

它并没有消失(移除),它只是被隐藏了。

这里我们使用单元格层的属性zPosition

来自Apple docs

此属性的默认值为 0。更改此属性的值会更改屏幕上图层的从前到后的顺序。这会影响框架矩形重叠的图层的可见性。

此属性的值以点为单位。

默认值为0。这导致顶部单元格隐藏底部单元格(例如阴影)。这意味着如果您为视图设置阴影使其在两侧显示并且两个单元格之前的边距为零,则仅顶部单元格的底部阴影会显示,底部阴影的顶部阴影将被隐藏。

当单元格离开屏幕然后返回时,虽然每个单元格的zPosition 仍然是0,但对于那些单元格,底部单元格现在隐藏顶部单元格。隐藏方向与滚动方向相反。这正是你遇到的情况。

那么,

cell.layer.zPosition = <#value you want#>

例如,我想显示兄弟姐妹的阴影,我可以将此单元格层的zPosition设置为-1,然后会出现两边的阴影。

zPosition 决定哪个单元格可以显示在前面,哪个单元格显示在后面。就像 CSS 中的 z-index

因此解决方案是更改 zPosition 属性以使其按预期工作。


此外,您不应将单元格的clipsToBounds 设置为YES。 (默认值为否)

【讨论】: