CAGradientLayer不适用于UITableViewCell边界

问题描述

我正在使用带有Xib文件自定义UITableViewCell开发简单的UITableView 我已经添加了MainView并将其固定到ContentView以便在MainView中添加所有视图 如下所示 UITableViewCell layout

当我尝试将CAGradientLayer添加到MainView时,它并不完全适合mainView边界,如下所示 whats happening on simulator 我用这段代码添加CAGradientLayer

    override func awakeFromNib() {
    super.awakeFromNib()
    
      let gradient = CAGradientLayer()
      mainView.layer.cornerRadius = 10
      gradient.frame = mainView.frame
      gradient.colors = [ColorCompatibility.gradEnd.cgColor,ColorCompatibility.gradStart.cgColor]
      gradient.endPoint = CGPoint(x: 0.5,y: 1)
      gradient.startPoint = CGPoint(x: 0.5,y: 0)
     // gradient.cornerRadius = 20
      
      gradient.shadowColor = ColorCompatibility.systemBackground.cgColor
      gradient.shadowOpacity = 0.8
      gradient.shadowOffset = .zero
      gradient.shadowRadius = 5
      gradient.shadowPath = UIBezierPath(roundedRect: mainView.layer.bounds,cornerRadius: 20).cgPath
      gradient.shouldRasterize = true
      gradient.rasterizationScale = UIScreen.main.scale
   
      contentView.layer.insertSublayer(gradient,at: 0)
   
    
}

我该如何解决

解决方法

这里有两个问题。首先是在awakeFromNib中,单元格(及其内容视图)很可能没​​有正确的框架,因此您可以可以在框架正确的地方使用另一个生命周期挂钩,但是随后旋转设备会遇到问题,因此运行时单元格会发生变化。

我建议更新layoutSublayers(of:)中的渐变图层框架。假设您为名为gradient的图层创建了一个属性:

override func layoutSublayers(of layer: CALayer) {
    super.layoutSublayers(of: layer)

    gradient.frame = mainView.bounds
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...