#ios #swift #storyboard #constraints #calayer
Вопрос:
У меня есть простое CustomView
. У меня есть CAGradientLayer
то, что я добавляю к этому layer
.
@IBDesignable
class CustomView: UIView {
override init (frame: CGRect) {
super.init(frame: frame)
setupView()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func layoutSubviews() {
super.layoutSubviews()
setupView()
}
private func setupView() {
let gradient = CAGradientLayer()
gradient.frame = bounds
gradient.colors = [UIColor.blue.cgColor, UIColor.yellow.cgColor]
layer.insertSublayer(gradient, at: 0)
}
}
Ниже Storyboard
приведена настройка
Ниже приведен результат в портретном режиме на iPad, что вполне нормально.
Когда ориентация устройства изменяется, слой CustomView
выступает за его границы.
Когда я проверил иерархию представлений в Xcode, рамка соответствующим CustomView
образом настроена, но это выступающий слой. Чтобы перепроверить, я удалил все коды setupView
и установил только цвет фона, при изменении ориентации CustomView
, как и ожидалось. Но почему это происходит для слоев?
Ответ №1:
Вы вставляете новый слой каждый раз при layoutSubviews
вызове метода. Это означает, что он показывает линию первого слоя.
Просто обновите кадр с layoutSubviews
и вызовите метод настройки с awakeFromNib
.
class CustomView: UIView {
private let gradient = CAGradientLayer()
override init (frame: CGRect) {
super.init(frame: frame)
setupView()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func layoutSubviews() {
super.layoutSubviews()
gradient.frame = bounds
}
override func awakeFromNib() {
super.awakeFromNib()
setupView()
}
private func setupView() {
gradient.colors = [UIColor.blue.cgColor, UIColor.yellow.cgColor]
layer.insertSublayer(gradient, at: 0)
}
}
Комментарии:
1. Спасибо, что указали на это!!