首页 > 解决方案 > CAGradientLayer 自转

问题描述

我使用 CAGradientLayer 来生成这个细线渐变。问题是自转不顺畅。随着 UIViewController 的旋转,我在 viewDidLayoutSubviews 中设置了包含该层的该视图的框架,并重置了该层的框架。当我自动旋转时,这条线的高度会增加,并且渐变会从上到下旋转一段时间。自动旋转这一层的正确方法是什么?

在此处输入图像描述

标签: iosuiviewuiviewcontrolleruikitcagradientlayer

解决方案


我建议不要在viewDidLayoutSubviews. 相反,我会让自动布局为你做这件事。

  • 首先,定义GradientView将呈现CAGradientLayer

    class GradientView: UIView {
        // specify that the base layer should be gradient layer
    
        override class var layerClass: AnyClass {
            return CAGradientLayer.self
        }
    
        // it can be convenient to have computed property that returns layer of the `layerClass`
    
        private var gradientLayer: CAGradientLayer {
            return layer as! CAGradientLayer
        }
    
        // when we update our array of colors, update the gradient layer accordingly
    
        var colors: [UIColor] = [] {
            didSet {
                gradientLayer.colors = colors.map { $0.cgColor }
            }
        }
    
        // initializers
    
        override init(frame: CGRect = .zero) {
            super.init(frame: frame)
            configure()
        }
    
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
            configure()
        }
    
        // configure the view for horizontal gradient
    
        private func configure() {
            colors = [.red, .yellow, .green, .blue]
            gradientLayer.startPoint = CGPoint(x: 0, y: 0.5)
            gradientLayer.endPoint = CGPoint(x: 1, y: 0.5)
        }
    }
    

    通过指定layerClass此子视图的 ,您不必担心调整大小问题。根据需要调整视图大小,图层将自动调整大小。

  • 然后,只需为新视图添加约束,并让自动布局负责配置。例如

    let gradientView = GradientView()
    gradientView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(gradientView)
    
    NSLayoutConstraint.activate([
        gradientView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -10),
        gradientView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10),
        gradientView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -10),
        gradientView.heightAnchor.constraint(equalToConstant: 3)
    ])
    

现在,显然,使用任何对你有用的约束,但希望这能说明这个想法。让自动布局配置frame视图,并让因为layerClassCAGradientLayer,它会自动为您更新。


推荐阅读