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
,因为layerClass
是CAGradientLayer
,它会自动为你更新。
【讨论】:
好的,我确实实现了 GradientView,但问题是高度不是常数。在纵向模式下,高度为 3 点,在横向模式下,宽度为 3 点。然后我看到自动旋转问题。这与 GradientView 无关,似乎是一个通用问题,与我在此问题中报告的相同。见***.com/questions/54389933/uiview-autorotation-issue 好的,这是一个不同的问题。有几种可能的方法,我已经在那里概述了......以上是关于CAGradientLayer 自转的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 中设置 CAGradient UIButton 的选定状态
`CAGradientLayer` 根据局部坐标空间定义起点和终点
如何将 CALayer 子类化为另一个 CALayer 掩码?