Swift UITableViewCell 阴影没有出现

Posted

技术标签:

【中文标题】Swift UITableViewCell 阴影没有出现【英文标题】:Swift UITableViewCell Shadow not appearing 【发布时间】:2020-12-16 19:25:21 【问题描述】:

我正在尝试创建在我的其他 UIViewControllers 中正常工作的自定义表格视图单元格。但是,在我的一个控制器中,阴影没有增长,我几乎看不到阴影。

这是一张红色阴影的图像,你可以看到它几乎不可见。

我的单元格在 contentView 中添加了一个 UIView 以创建浮动单元格效果 - 我的控制器使用相同的代码和相同的故事板布局,但这是唯一出现阴影问题的表格视图 - 所以我一定是失踪了东西。

我的addShadow 分机:

extension UIView 
    func addShadow(offset: CGSize, color: UIColor, radius: CGFloat, opacity: Float) 
        layer.masksToBounds = false
        layer.shadowOffset = offset
        layer.shadowColor = color.cgColor
        layer.shadowRadius = radius
        layer.shadowOpacity = opacity
    

我在自定义单元格上的awakeFromNib

::cellContentView 是我添加到单元格的基础contentView 的 UIView。

   override func awakeFromNib() 
        super.awakeFromNib()

        self.backgroundColor = .clear
        self.selectionStyle = .none
        cellContentView?.layer.masksToBounds = true
        cellContentView?.round(corners: [.topLeft, .topRight, .bottomLeft, .bottomRight], radius: 10)
        cellContentView?.addShadow(offset: CGSize(width: 40, height: 60), color: UIColor.red, radius: 10, opacity: 1)
        cellContentView?.layer.shouldRasterize = true
    

注意:.round 是我所有单元格上使用的扩展名。

无论我为这个阴影添加什么半径或偏移量,它都不会比图像大。此外,我在其控制器中的其他单元都不需要设置 shouldRasterize 属性,但确实如此。

有人知道这里发生了什么吗? 谢谢:)

编辑

奇怪的是,如果我在视图周围添加约束以保持视图和单元格内容视图之间的间隙较大,则背景颜色会消失 - 这在情节提要中设置为白色。

【问题讨论】:

你可以试试 layer.masksToBounds = true 我猜你的 cellContentView 视图被限制在非常靠近包含视图的边缘,并且 contentView 设置为 clipsToBounds。您可以设置contentView.clipsToBounds = false(可能会产生奇怪的后果),或者您可以使cellContentView 的约束更大,以便在该视图和父视图的边缘之间腾出空间。 @achu 我试过这个但没有运气:( @creeperspeak 我也这么认为,所以我启用了单元格分隔符,但差距非常明显 - 即使有限制,这仍然无法正常工作,这很奇怪,因为相同的代码适用于所有其他单元格在我的应用中。 【参考方案1】:

你应该调用 layoutSubviews 方法。因为应该在视图上传后添加阴影

override func awakeFromNib() 
    super.awakeFromNib()
    //init methods


override public func layoutSubviews() 
    super.layoutSubviews()
    //Added shadow
    self.reloadLayers()


private func reloadLayers() 
    self.layer.cornerRadius = 5
    self.addShadow(.TransactionCell)

希望对您有所帮助

【讨论】:

感谢您的提示!如果我尝试这样做,它并不能解决我的问题,但这很有用:)【参考方案2】:

内容视图将填满您的单元格,因此您需要在内容视图中添加阴影以查看其中包含所有组件的内容。然后在该视图和内容视图之间添加约束。其次,阴影的 40 和 60 属性可能太大了,当我说太大时,我的意思是难以置信的大,因为单元格中内容视图之间的差距不超过 15 - 30 甚至更小。所以尝试使用更少的值,虽然半径可以保持 10,但你会看到最适合的值。如果单元格内容视图是您的自定义视图,如果您的视图不是透明的或其中的任何内容,那么值将完成这项工作,在这种情况下它不会,并且很难解决这个问题,我尝试了许多库和自定义代码而且永远不会好。

    squircleView.layer.cornerRadius = 40
    squircleView.layer.cornerCurve = CALayerCornerCurve.continuous
    squircleView.layer.shadowColor = UIColor.systemGray.cgColor
    squircleView.layer.shadowOpacity = 0.7
    squircleView.layer.shadowOffset = CGSize(width: 0, height: 0.5)
    squircleView.layer.shadowRadius = 5

【讨论】:

以上是关于Swift UITableViewCell 阴影没有出现的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UITableViewCell 阴影消失

如何在swift中仅使用角半径为3条边添加阴影?

UITableViewCell 阴影未为某些单元格绘制

tvOS 上 UITableViewCell 的自定义背景

UITableViewCell 在取消选择时选择了阴影颜色

UITableViewCell 自定义图片大小、阴影和边框