CAGradientLayer 自转

Posted

技术标签:

【中文标题】CAGradientLayer 自转【英文标题】:CAGradientLayer autorotation 【发布时间】:2019-01-27 11:54:01 【问题描述】:

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

【问题讨论】:

【参考方案1】:

我建议不要在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,它会自动为你更新。

【讨论】:

好的,我确实实现了 GradientView,但问题是高度不是常数。在纵向模式下,高度为 3 点,在横向模式下,宽度为 3 点。然后我看到自动旋转问题。这与 GradientView 无关,似乎是一个通用问题,与我在此问题中报告的相同。见***.com/questions/54389933/uiview-autorotation-issue 好的,这是一个不同的问题。有几种可能的方法,我已经在那里概述了......

以上是关于CAGradientLayer 自转的主要内容,如果未能解决你的问题,请参考以下文章

带有圆角的 UIView CAGradient?

在 iOS 中设置 CAGradient UIButton 的选定状态

`CAGradientLayer` 根据局部坐标空间定义起点和终点

如何将 CALayer 子类化为另一个 CALayer 掩码?

应用于 UITextView 的 CAGradient 颜色错误

在 UIImageView 上应用 CAGradient 层在上边缘和左边缘