阴影不符合 UITableViewCell 中视图的形状

Shadow not conforming to the shape of view in UITableViewCell

我有一个 table 视图,我试图在其中添加卡片式单元格。为此,我在单元格的内容视图上添加了一个 UIView (paddingView),其大小略小于它。现在要创建阴影效果,我使用以下代码:

    let path = UIBezierPath(rect: cell.paddingView.bounds)
    cell.paddingView.layer.shadowPath = path.CGPath
    cell.paddingView.layer.shadowOffset = CGSizeMake(0.5, 0.5)
    cell.paddingView.layer.shadowOpacity = 0.4

首次加载 table 视图时会出现问题。每个单元格下的阴影显示如下:

这是我滚动一次时的样子 怎样才能保证阴影效果正常,而不是像上图那样?

您在第一次加载时看到的错误阴影宽度问题与在 paddingView 单元格子视图布局之前使用边界有关。

实例化单元格时,它可能会以错误的初始宽度(基于故事板)开始,而不是最初设置为 tableView 的实际宽度。

问题在滚动关闭然后出现在屏幕上后消失的原因是重复使用的单元格具有正确的 paddingView 边界宽度,因此阴影现在显示正确。

这是自调整单元格最初未正确布局的常见问题,直到 table 被(滚动或)重新加载。 several workarounds 回溯了将近两年,从重新加载 table 到强制布局传递不等。

两者都确保单元格初始宽度在第一次使用时是正确的。

如果您支持旧版本的 iOS,则可能会出现此问题。我不记得 iOS 的哪个确切版本永久修复了它,但我已经有一段时间没有解决这个问题了。

看来是storyboard中的frame和runtime中的frame不一样的问题

因此,当您推出它时,它就成功了。 因为刷新了布局。

尝试将此代码添加到函数中 cellForRowAtIndexPath:

cell.setNeedsLayout()

cell.layoutIfNeeded()

试试这个

    cell.vwMain.layer.shadowOffset = CGSize(width: 0, height: 5)
    cell.vwMain.layer.shadowOpacity = 0.05
    cell.vwMain.layer.shadowRadius = 5

    cell.layer.shadowOffset = CGSizeMake(0.0, 5);
    cell.layer.shadowOpacity = 0.2;
    cell.layer.shadowRadius = 5;

这会给你一个卡片风格的效果

将新单元格添加到 table 屏幕外时,阴影出现了完全相同的问题。这听起来像是错误的 shadowPath 因为单元格出现在屏幕外时边界稍微不正确。

找到两个适用于我的案例的可能解决方案:

解决方案 1:将 tableView.reloadData() 更改为

tableView.reloadData()
tableView.setNeedsLayout()
tableView.layoutIfNeeded()
tableView.reloadData()

解决方案 2:根本不设置 shadowPath,我的意思是只需将其从示例代码中删除即可:

// cell.paddingView.layer.shadowPath = path.CGPath

shadowPath 主要用于提高性能。不设置会动态计算