向 UITableViewCell 的 UIView(背景视图)添加子层会覆盖其他单元格视图吗?

Posted

技术标签:

【中文标题】向 UITableViewCell 的 UIView(背景视图)添加子层会覆盖其他单元格视图吗?【英文标题】:Adding a sublayer to a UIView (background view) of UITableViewCell covers other cell views? 【发布时间】:2018-08-02 01:37:23 【问题描述】:

我正在尝试向UIView 添加一个渐变,作为UITableViewCell 的背景(backgroundRect)。我希望渐变绘制在与 backgroundRect 相同的 Z 位置,但是当在设备上构建时,它会遮盖(在顶部)我的标签和其他视图。令人困惑的是,当我使用 ViewDebugger 时,它会显示我的视图,就好像它们应该出现在它们后面的渐变层一样?

class NewWorkoutTableViewCell: UITableViewCell 

        @IBOutlet weak var backgroundRect: UIView!

        @IBOutlet weak var dayOfTheWeekLabel: UILabel!

        @IBOutlet weak var sessionTypeLabel: UILabel!
        @IBOutlet weak var dateLabel: UILabel!
        @IBOutlet weak var sessionTypeImage: UIImageView!

        @IBOutlet weak var scoreLabel: UILabel!

        override func awakeFromNib() 
            super.awakeFromNib()

            backgroundRect.layer.cornerRadius = 8.0

            backgroundRect.layer.shadowColor = UIColor.black.cgColor
            backgroundRect.layer.shadowOpacity = 0.5
            backgroundRect.layer.shadowOffset = CGSize(width: 5, height: 5)
            backgroundRect.layer.shadowRadius = 5

            // this is making a CoreAnimation gradient layer
            let gradient = CAGradientLayer() // Line 1

            // this is setting the dimensions of the gradient to the
            // same as the view that will contain it
            gradient.frame = backgroundRect.bounds // Line 2
            //gradient.locations = [0.0, 0.35]
            gradient.startPoint = CGPoint(x: 0.0, y: 0.5)
            gradient.endPoint =  CGPoint(x: 1.0, y: 0.5)


            let iPhoneForegroundColor = UIColor(red:0.22, green:0.26, blue:0.40, alpha:1.0)

            // this is setting the gradient from and to colors
            gradient.colors = [UIColor.white.cgColor,iPhoneForegroundColor.cgColor] // Line 3


            backgroundRect.layer.addSublayer(gradient) // Line 4


        



    

【问题讨论】:

您能显示此单元格的xib/storyboard 设置吗?还有一些图像的当前和预期结果? 当然见上面@Kamran 设置gradient.zPosition = -1。不确定这是否可行,但您可以尝试。问题是所有 ui 元素都添加到背景矩形中,因此当您添加渐变层时,它被添加到所有这些元素之上。 backgroundRect.layer.insertSublayer(gradient, at: 0) 希望这对你有用@GarySabo 【参考方案1】:

随便用

backgroundRect.layer.insertSublayer(gradient, at: 0) 

而不是使用

backgroundRect.layer.addSublayer(gradient)

【讨论】:

谢谢!如何获得对这个 subLayer(在 0 处)的引用,以便我可以添加我的投影到它?否则阴影会添加到它下面的图层吗? Yiu 正在编写这段代码 n awakeFromNib(),它在 cel 启动时被调用,因此无论你想添加什么,比如 gradientView 或 shadow,在添加到 mainLayer 之前写下所有这些,第二个选项我一直使用的是创建 UIView 的不同子类,例如 class GradientView: UIView /// 在此处添加阴影 并使用此类 Object 添加为子视图并在一个类中保存额外的负载【参考方案2】:

调试 UI 并查看添加的图层是否覆盖了子视图...我认为您的图层覆盖了子视图。

【讨论】:

以上是关于向 UITableViewCell 的 UIView(背景视图)添加子层会覆盖其他单元格视图吗?的主要内容,如果未能解决你的问题,请参考以下文章

无法向 UITableViewCell 添加标签

无法向 UITableViewCell 添加值

滚动时如何向 UITableViewCell 添加更多按钮?

向 UITableViewCell 添加约束

如何向 UITableViewCell 添加手势?

UITableViewCell 覆盖向左滑动的删除按钮