为什么渐变不会覆盖视图的整个宽度

fs_*_*gre 4 ios swift

我正在尝试将渐变应用于主视图的顶部,左侧和右侧约束的视图,但由于某种原因,渐变不会覆盖应用于视图的整个宽度(请参阅黄色图片).

class ViewController: UIViewController {

    @IBOutlet weak var myView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let gradient = CAGradientLayer()
        gradient.colors = [UIColor.blue.cgColor, UIColor.white.cgColor]
        gradient.startPoint = CGPoint(x:00, y:00)
        gradient.endPoint = CGPoint(x:0, y:0.6)
        gradient.frame = myView.bounds
        myView.clipsToBounds = true
        myView.layer.insertSublayer(gradient, at: 0)
    }
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

在此输入图像描述

Dun*_*n C 21

问题可能是您要添加渐变图层viewDidLoad().直到之后,视图才会设置为最终大小viewDidLoad().

您的视图控制器可能会在您的XIB/Storyboard中设置,其屏幕大小与您运行它时不同.(假设您将其设置为iPhone SE大小,但是您在6上运行它.6的屏幕稍微宽一点,因此在首次加载视图时,图层将设置为iPhone SE的宽度.然后将调整视图的大小,但不会调整图层的大小.)

您应该实现UIViewController方法viewDidLayoutSubviews(),并在该方法中调整图层的框架:

override func viewDidLayoutSubviews() {
  gradientLayer.frame = self.view.bounds
}
Run Code Online (Sandbox Code Playgroud)

这样,如果视图被调整大小(例如,由于自动旋转),则将相应地自动调整渐变层.

编辑:

正如Sulthan所指出的,默认情况下,对图层框架的更改是动画的.您应该将框架更改包装在CATransaction.begin/中CATransaction.end并禁用操作,如下所示:

override func viewDidLayoutSubviews() {
  CATransaction.begin()
  CATransaction.setDisableActions(true)
  gradientLayer.frame = self.view.bounds
  CATransaction.commit()
}
Run Code Online (Sandbox Code Playgroud)