reloadSections 后阴影在 UITableView 中持续存在:

Shadows Persist in UITableView after reloadSections:

由于我们的设计师是个虐待狂,我有一个带有分段控件的 UITableView,可以在不同提要中的两种不同类型的单元格之间切换。这些单元格使用不同的标识符和 classes 出队——这一切都很好。这些单元格共享一个父级但大小不同,出于优化原因,我在父级的 layoutSubviews() 中手动设置了 layer.shadowpath。我需要阴影:设计师的愿望。

问题是,在我切换到 second 部分后,在 table 下方的一些地方,我认为上面的单元格有阴影悬垂.正如您从第一张图片中看到的那样,有两个阴影,如果我向下滚动以遮挡最上面的可见单元格,阴影就会消失,这让我相信阴影被抵消了。进一步滚动会使这些阴影消失并且不会再次出现,直到再次切换选项卡。其余的阴影都很好。

两个影子

稍微向下滚动

当切换回上一个选项卡时,单元格较高,也存在阴影问题,但那些阴影太短了。如前所述,设置阴影路径的代码在父级 class 中,父级 class 负责制作和布局包含自定义的最顶层 "card" 视图子细胞。

我以编程方式完成所有事情:设置视图和自动布局。目前单元格高度是硬编码的。 我不确定哪些信息是相关的,因为我完全不知所措,所以这里是我如何设置 shadowPath

override func layoutSubviews() {
    super.layoutSubviews()
    cardView.layer.shadowPath = UIBezierPath(rect: cardView.bounds).CGPath
}

为简单起见,卡片布局在 contentView 中,视觉格式如下:

"V:|-marginV-[card]-marginV-|"
"H:|-marginH-[card]-marginH-|"

无论出于何种原因,即使我使用了单独的 类 和单独的 reuseIdentifiers,刚从视口出来的第一个重复使用的单元格的大小仍然与另一部分中的高单元格相同.当我改变

let cell = tableView.dequeueReusableCellWithIdentifier(booksReuseIdentifier) as! ProfileBookCell 将 indexPath 包含为

let cell = tableView.dequeueReusableCellWithIdentifier(booksReuseIdentifier, forIndexPath: indexPath) as! ProfileBookCell 回收问题已解决,边界已正确计算。我在十几个不同的地方试过 layoutIfNeeded 都没有效果,但这解决了问题。

我遇到了完全相同的问题,我尝试了当前标记的解决方案,但似乎没有任何其他效果。在尝试了很多其他事情之后,我终于尝试将我的添加影子代码移动到我的子类 UITableViewCell 的 layoutSubviews 函数中,它终于成功了!我认为这是可行的,因为单元格的最终大小在 layouSubviews 调用之前并不总是正确计算,并且它需要正确的大小来绘制阴影。

override func layoutSubviews() {
     super.layoutSubviews()
    addShadow(cell: self)
}

private func addShadow(cell:UITableViewCell) {
    cell.layer.shadowOffset = CGSize(width:1, height:1)
    cell.layer.shadowColor = UIColor.black.cgColor
    cell.layer.shadowRadius = 1
    cell.layer.shadowOpacity = 0.6

    cell.clipsToBounds = false

    let shadowFrame: CGRect = (cell.layer.bounds)
    let shadowPath: CGPath = UIBezierPath(rect: shadowFrame).cgPath
    cell.layer.shadowPath = shadowPath
}