微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

奇怪的UITableViewCell阴影行为

如何解决奇怪的UITableViewCell阴影行为

我正在尝试为单个UITableViewCell添加阴影。我在自定义单元格子类中使用以下代码

override func layoutSubviews() {
    super.layoutSubviews()

    layer.masksToBounds = false
    layer.shadowOffset = CGSize(width: 0,height: 1)
    layer.shadowColor = UIColor.black.cgColor
    layer.shadowOpacity = 0.9
    layer.shadowRadius = 10
    layer.shadowPath = CGPath(rect: bounds,transform: nil)
}

但是阴影通常仅出现在单元格的底部/顶部边缘,并且在滚动过程中会发生变化。

This is what it does

有人可以帮助我吗?

解决方法

您看不到阴影,因为在视图层次结构中上方/下方的单元格较高,这取决于在自定义单元格之前还是之后将其出队。在Xcode中查看View-Hierarchy-Debugger来发现问题。

您有几种可能的解决方案,但我将在此处概述其中两个:

  1. 您可以在bringSubviewToFront中使用tableView,以确保自定义单元格始终位于顶部。
override func tableView(_ tableView: UITableView,willDisplay cell: UITableViewCell,forRowAt indexPath: IndexPath) {
    if cell.isKind(of: MyCustomShadowCell.self) {
        tableView.bringSubviewToFront(cell)
    }
}
  1. 另一种解决方案是将单元格的layer.zPosition设置为较高值,以使其始终位于顶部。 Imo有点黑,但如果您想尝试:layer.zPosition = CGFloat.greatestFiniteMagnitude
,

layoutSubviews()不适用于此类UI设置。 由于只需要向某些特定的单元格添加阴影,因此在用数据填充单元格时应用或删除阴影。不要忘记删除不必要的阴影,否则,当单元被重用时,阴影将保留。

,

您的阴影必须包含在单元格范围内。发生的情况是您的阴影实际上超出了单元格的范围,并且当单元格被重新使用并放置在表格视图中时,下一个单元格将覆盖您的阴影。当您上下滚动时,单元会以不同的顺序再次使用,具体取决于您的阴影是否出现。

尝试更改此行代码

layer.shadowPath = CGPath(rect: bounds,transform: nil)

对此

layer.shadowPath = CGPath(rect: .init(x: 0,y: 10,width: contentView.bounds.width,height: contentView.bounds.height - 20),transform: nil)

这会将您的阴影置于边界之内,但我认为它的效果不及我的下一个建议。

我对您的第二个建议是创建另一个父视图来保存您的单元格子视图。然后将其添加为单元格contentView的子视图,并将阴影而不是单元格contentView应用于父视图层。确保父视图的顶部和底部填充为10,您将实现所需的效果。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。