【问题标题】:UITableViewCell shadow disappears on scroll (iOS 13)UITableViewCell 阴影在滚动时消失(iOS 13)
【发布时间】:2020-06-27 13:51:51
【问题描述】:

我在我的应用程序中发现了一些回归,我很确定现在才开始在 Xcode 11.3.1 (iOS 13) 上。

它曾经工作得很好,但现在我们开始看到一些奇怪的东西......我们添加到每个单元格的阴影突然在 tableview 滚动上自行消失。

应用程序使用UITableView 和内部委托方法willDisplayCell: 我们称之为代码:

dispatch_async(dispatch_get_main_queue(), ^{
    view.layer.cornerRadius = 4.0f;
    view.layer.borderWidth = 1.0f;
    view.layer.borderColor = [UIColor clearColor].CGColor;

    view.layer.shadowColor = shadowColor != nil ? shadowColor.CGColor : [[UIColor lightGrayColor] CGColor];
    view.layer.shadowOffset = CGSizeMake(0, 2.0f);
    view.layer.shadowRadius = 2.0f;
    view.layer.shadowOpacity = 1.0f;
    view.layer.masksToBounds = NO;
    view.layer.shadowPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds cornerRadius:view.layer.cornerRadius].CGPath;
});

我尝试与view.layer.zPositionview.backgroundColor=UIColor.clearColor 一起玩,但没有成功。

有人知道那里发生了什么吗?

更新:

同样的问题也发生在 UICollectionView 中。

回答 cmets:

  1. 将 plist 中的 UIUserInterfaceStyle 更改为“Light”没有帮助。
  2. 在方法结束时设置 shadowColor - 没有帮助。
  3. 在 cellforrow 中添加阴影而不是 willdisplaycell - 没有帮助

【问题讨论】:

  • 尝试在 info.plist 中添加 UIUserInterfaceStyleLight
  • @BenRockey 是对的,如果您的手机启用了暗模式,则添加此 UIUserInterfaceStyleLight 键以使您的应用主题变亮或使暗模式关闭然后检查...
  • 您将角半径和 clipstobounds = true 赋予视图,然后赋予阴影..它根本不起作用,因为您的边框会被剪裁...使用两个视图..外部视图带有阴影和带有圆角半径的内部视图...外部视图的背景颜色也应该清晰。
  • 我遇到了一些阴影没有被应用的问题,你可以尝试在方法结束时设置 shadowColor 吗?
  • 你试过在 cellforrow 中添加阴影而不是 willdisplaycell 吗?

标签: ios objective-c uitableview uikit shadow


【解决方案1】:

尝试在 collectionview 单元格的 awakefrom nib 中添加阴影,如下代码所示。

override func awakeFromNib() {
    super.awakeFromNib()
    view.layer.shadowColor = UIColor.red.cgColor
    view.layer.shadowOffset = CGSize(width: 0, height: 2)
    view.layer.shadowRadius = 2
    view.layer.shadowOpacity = 1
    view.layer.masksToBounds = false
}

【讨论】:

  • 你还在用图层做其他事情吗?还是设置 clipstobounds 来查看?
【解决方案2】:

我也遇到了这个问题。我发现问题是由于某种原因,当单元格显示时,layer.clipsToBound 被重置为 True。您需要做的就是在 tableViewDelegate 调用 viewWillDisplayCell 时设置 layer.clipsToBound = false

这对我有用。

【讨论】: