Поскольку UIStackView
предназначен для организации своих подпредставлений, выполнение анимированного дополнения таким способом может быть сложным для выполнения.
Итак, один из вариантов:
- Начните сочистите "
holderView
" в stackView - добавьте свой
customObject
к основному виду (теперь он является родственным элементом stackView) - анимируйте позицию и размер
customObject
для соответствияholderView
- после завершения анимации, добавьте
customObject
в качестве подпредставления holderView
Вотпример кода для тестирования (примечание: просто демонстрационный код, не готовый к производству):
//
// AnimToStackViewController.swift
//
// Created by Don Mag on 6/28/19.
//
import UIKit
class CustomObject: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
let theLabel = UILabel()
theLabel.textAlignment = .center
theLabel.text = "Custom Object"
theLabel.translatesAutoresizingMaskIntoConstraints = false
addSubview(theLabel)
NSLayoutConstraint.activate([
theLabel.centerXAnchor.constraint(equalTo: centerXAnchor),
theLabel.centerYAnchor.constraint(equalTo: centerYAnchor),
])
backgroundColor = .cyan
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
class AnimToStackViewController: UIViewController {
let theStackView: UIStackView = {
let v = UIStackView()
v.translatesAutoresizingMaskIntoConstraints = false
v.axis = .horizontal
v.alignment = .fill
v.distribution = .fill
return v
}()
let theLabel: UILabel = {
let v = UILabel()
v.textAlignment = .center
v.text = "This is the label in the stack view."
v.numberOfLines = 0
return v
}()
let holderView: UIView = {
let v = UIView()
v.translatesAutoresizingMaskIntoConstraints = false
return v
}()
let customObject = CustomObject(frame: CGRect(x: 0, y: 0, width: 150, height: 150))
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(theStackView)
theStackView.addArrangedSubview(theLabel)
theStackView.addArrangedSubview(holderView)
view.addSubview(customObject)
NSLayoutConstraint.activate([
theStackView.widthAnchor.constraint(equalToConstant: 300.0),
theStackView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 80.0),
theStackView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
holderView.widthAnchor.constraint(equalTo: customObject.widthAnchor, constant: 0.0),
holderView.heightAnchor.constraint(equalTo: customObject.heightAnchor, constant: 0.0),
])
customObject.center = view.center
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let pt = self.holderView.center
let convertedPoint = self.theStackView.convert(pt, to: self.view)
UIView.animate(withDuration: 1.0, delay: 3.0, options: [], animations: {
self.customObject.center = convertedPoint
self.view.layoutIfNeeded()
}, completion: { (finished) in
if finished {
self.holderView.addSubview(self.customObject)
self.customObject.frame = self.holderView.bounds
}
})
}
}