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

时间:2016-06-22 07:09:28

标签: ios swift uitableview shadow

我有一个表视图,我正在尝试添加卡式单元格。为了实现这一点,我在单元格的内容视图中添加了一个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

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

enter image description here

这是我滚动一次时的样子 如何确保阴影效果正确,而不是像上图那样?

enter image description here

4 个答案:

答案 0 :(得分:4)

首次加载时看到的错误阴影宽度问题与在细胞的子视图布局之前使用paddingView 的边界有关。

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

在屏幕上滚动之后问题消失的原因是重用的单元格具有正确的paddingView边界宽度,因此阴影现在看起来是正确的。

对于自动调整大小的单元格而言,这是一个常见问题,最初没有正确布局,直到表格(滚动或)重新加载。有several workarounds可以追溯到近两年,从重新加载表格到强制布局通行证都有所不同。

两者都确保首次使用时单元初始宽度正确。

如果您支持旧版iOS,则可能会出现此问题。我不记得哪个版本的iOS确实能够很好地修复它,但我已经有一段时间不必解决这个问题。

答案 1 :(得分:1)

似乎问题在于故事板中的框架与运行时框架之间存在差异。

因此,当你滚动它的时候。 因为布局已刷新。

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

cell.setNeedsLayout()

cell.layoutIfNeeded()

答案 2 :(得分:0)

试试这个

    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;

这会给你一种卡片式的效果

答案 3 :(得分:0)

将新单元格添加到屏幕外时,阴影问题完全相同。这听起来像是错误的shadowPath,因为该单元格在屏幕外出现时边界略有错误。

找到了两种适用于我的情况的解决方案:

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

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

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

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

shadowPath通常是提高性能所需的。如果未设置,它将动态地计算。