您可以使用视图的“基础”层作为CAGradientLayer
像这样:
// use the "base" layer as a gradient layer
lazy var gradientLayer: CAGradientLayer = self.layer as! CAGradientLayer
override class var layerClass: AnyClass {
return CAGradientLayer.self
}
所以你的班级就变成了:
final class ShimmerLabel: UIView {
private lazy var backShimmerTextLabel: UILabel = {
let label = UILabel()
label.text = "Shimmer"
label.textColor = UIColor(red: 65/255, green: 65/255, blue: 65/255, alpha: 1)
label.font = UIFont.systemFont(ofSize: 50)
label.textAlignment = .center
return label
}()
private lazy var frontShimmerTextLabel: UILabel = {
let label = UILabel()
label.text = "Shimmer"
label.textColor = .white
label.font = UIFont.systemFont(ofSize: 50)
label.textAlignment = .center
return label
}()
// use the "base" layer as a gradient layer
lazy var gradientLayer: CAGradientLayer = self.layer as! CAGradientLayer
override class var layerClass: AnyClass {
return CAGradientLayer.self
}
init() {
super.init(frame: .zero)
configureGradientLayer()
configureLayout()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func configureGradientLayer() {
gradientLayer.colors = [UIColor.white.cgColor, UIColor.black.cgColor]
gradientLayer.locations = [0, 1]
}
private func configureLayout() {
addSubview(backShimmerTextLabel)
backShimmerTextLabel.snp.makeConstraints { make in
make.width.height.equalToSuperview()
}
addSubview(frontShimmerTextLabel)
frontShimmerTextLabel.snp.makeConstraints { make in
make.width.height.equalToSuperview()
}
}
}
并且渐变将始终填充视图框架。无需添加子层。
Edit
If you need渐变层作为子层,你需要更新它的框架layoutSubviews()
:
override func layoutSubviews() {
super.layoutSubviews()
gradientLayer.frame = bounds
}
所以,让let gradientLayer = CAGradientLayer()
您认为的财产...
final class ShimmerLabel: UIView {
private let gradientLayer: CAGradientLayer = CAGradientLayer()
private lazy var backShimmerTextLabel: UILabel = {
let label = UILabel()
label.text = "Shimmer"
label.textColor = UIColor(red: 65/255, green: 65/255, blue: 65/255, alpha: 1)
label.font = UIFont.systemFont(ofSize: 50)
label.textAlignment = .center
return label
}()
private lazy var frontShimmerTextLabel: UILabel = {
let label = UILabel()
label.text = "Shimmer"
label.textColor = .white
label.font = UIFont.systemFont(ofSize: 50)
label.textAlignment = .center
return label
}()
init() {
super.init(frame: .zero)
configureGradientLayer()
configureLayout()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func configureGradientLayer() {
gradientLayer.colors = [UIColor.white.cgColor, UIColor.black.cgColor]
gradientLayer.locations = [0, 1]
layer.addSublayer(gradientLayer)
}
private func configureLayout() {
addSubview(backShimmerTextLabel)
backShimmerTextLabel.snp.makeConstraints { make in
make.width.height.equalToSuperview()
}
addSubview(frontShimmerTextLabel)
frontShimmerTextLabel.snp.makeConstraints { make in
make.width.height.equalToSuperview()
}
}
override func layoutSubviews() {
super.layoutSubviews()
// update gradient layer frame
gradientLayer.frame = bounds
}
}