Я думаю, что один из простых способов справиться с этим - это анимировать константу ограничения следующим образом:
@IBOutlet weak var heightConstraint: NSLayoutConstraint!
UIView.animate(withDuration: 3, animations: {
self. heightConstaint.constant = 300 // This constant is the height of top big view.
self.view.layoutIfNeeded()}
Есть еще одна точка зрения, в которой находится CAShapeLayer. Я называю это line View
.Его высота должна быть такой же, как и высота top big view
.
В line view
вы можете добавить анимацию.Это должно быть похоже на вашу реализацию.
override func didMoveToSuperview() {
super.didMoveToSuperview()
dashedLayer.backgroundColor = UIColor.clear.cgColor
layer.addSublayer(dashedLayer)
height = bounds.size.height
}
override func layoutSubviews() {
super.layoutSubviews()
let centerX = bounds.size.width / 2
let path = CGMutablePath()
path.addLines(between: [CGPoint(x: centerX, y: 0), CGPoint(x: centerX, y: frame.height)])
dashedLayer.path = path
dashedLayer.lineWidth = 3.0
dashedLayer.strokeColor = UIColor.blue.cgColor
let animation = CABasicAnimation(keyPath: "strokeEnd")
animation.fromValue = height / bounds.size.height
animation.toValue = 1.0
animation.timingFunction = CAMediaTimingFunction.init(name: CAMediaTimingFunctionName.easeInEaseOut)
height = bounds.size.height
animation.duration = 3.0
dashedLayer.add(animation, forKey: nil)
}
Это расширяется здесь.Вы можете адаптировать код для заключения контракта самостоятельно.
Ниже приведена анимация реверса.
override func didMoveToSuperview() {
super.didMoveToSuperview()
dashedLayer.backgroundColor = UIColor.clear.cgColor
layer.addSublayer(dashedLayer)
height = bounds.size.height
clipsToBounds = true
}
override func layoutSubviews() {
super.layoutSubviews()
let centerX = bounds.size.width / 2
let path = CGMutablePath()
path.addLines(between: [CGPoint(x: centerX, y: 0), CGPoint(x: centerX, y: max(height , bounds.size.height) )])
dashedLayer.path = path
dashedLayer.lineWidth = 3.0
dashedLayer.strokeColor = UIColor.blue.cgColor
let animation = CABasicAnimation(keyPath: "strokeEnd")
if (height < bounds.size.height){
animation.fromValue = height / bounds.size.height
animation.toValue = 1.0}
else {
animation.fromValue = 1.0
animation.toValue = bounds.size.height / height}
animation.timingFunction = CAMediaTimingFunction.init(name: CAMediaTimingFunctionName.easeInEaseOut)
height = bounds.size.height
animation.duration = 3
dashedLayer.add(animation, forKey: nil)
}