Слои не меняются при изменении размера представления, поэтому вы хотите создать настраиваемое представление и переопределить layoutSubviews()
.
Вот пример:
@IBDesignable
class GradBorderView: UIView {
var gradient = CAGradientLayer()
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
func commonInit() -> Void {
layer.addSublayer(gradient)
}
override func layoutSubviews() {
gradient.frame = bounds
gradient.colors = [UIColor.green.cgColor, UIColor.yellow.cgColor, UIColor.red.cgColor]
gradient.startPoint = CGPoint(x: 0.1, y: 0.78)
gradient.endPoint = CGPoint(x: 1.0, y: 0.78)
let shapeLayer = CAShapeLayer()
shapeLayer.path = UIBezierPath(rect: bounds).cgPath
shapeLayer.fillColor = UIColor.clear.cgColor
shapeLayer.strokeColor = UIColor.black.cgColor
shapeLayer.lineWidth = 4
gradient.mask = shapeLayer
}
}
Теперь, когда ваше представлениеизменяя размер в зависимости от ограничений и автоматического размещения, граница градиента будет корректно «автоматически изменять размер».
Кроме того, с помощью @IBDesignable
вы можете увидеть результаты при разметке ваших представлений в раскадровке / Интерфейсном Разработчике.
Вот как это выглядит при ширине Grad Border View
, установленной на 240
:
и с Grad Border View
ширина установлена на 320
: