【问题标题】:Strange UITableViewCell shadow behaviour奇怪的 UITableViewCell 阴影行为
【发布时间】:2021-02-19 09:02:00
【问题描述】:

我正在尝试向单个 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)
}

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

谁能帮帮我?

【问题讨论】:

  • 您的阴影路径必须在您的单元格范围内。您将 shadowRadius 设置为 10,但阴影路径是您的 cell.bounds,然后阴影超出了您的单元格边界,因此您会遇到这种行为。

标签: ios swift uitableview calayer shadow


【解决方案1】:

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

尝试更改这行代码

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 的填充,您将实现您想要的。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 非常感谢 :) ,bringSubviewToFront 解决了我的问题。我已经为此苦苦挣扎了几个小时。
    【解决方案3】:

    layoutSubviews() 不适合进行此类 UI 设置。 由于您只需要向某些特定单元格添加阴影,因此在用数据填充单元格时应用或删除它。不要忘记去除不必要的阴影,否则,当单元格被重复使用时,阴影会留下来。

    【讨论】:

    • 我在用你说的数据填充单元格时尝试添加阴影。行为是一样的。其他单元格有不同的类和重用标识符,我只需要这个特定的阴影。我尝试清除 prepareForReuse() 中的阴影
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    相关资源
    最近更新 更多