Я бы предложил выйти из дела настройки подслоя в 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)
])
Теперь четко используйте любые ограничения, которые вам подходят, но, надеюсь, это иллюстрирует идею.Пусть auto layout сконфигурирует frame
вида, и пусть, поскольку layerClass
равен CAGradientLayer
, он будет обновляться автоматически для вас.