Я программно создал хороший кастом, выпадающий список.
Все отлично работает, кроме анимации.
Вот результат с анимацией, когда я вызываю self.setNeedsLayout()
А вот когда я не пользуюсь self.setNeedsLayout()
Мой кастомпредставление Я вставил его в стеке
Вот мой пользовательский вид:
class FittoBoxView: UIView {
let headerView: UIView = {
let view = UIView()
view.translatesAutoresizingMaskIntoConstraints = false
view.backgroundColor = .gray
return view
}()
var open = true
var heightContraint: NSLayoutConstraint!
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder: NSCoder) {
super.init(coder: coder)
}
}
extension FittoBoxView {
func registerView(with constraint: NSLayoutConstraint) {
heightContraint = constraint
translatesAutoresizingMaskIntoConstraints = false
backgroundColor = .red
// Adding header
let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
headerView.addGestureRecognizer(tap)
addSubview(headerView)
headerView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
headerView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
headerView.heightAnchor.constraint(equalToConstant: 45).isActive = true
heightContraint.constant = 400
}
@objc func handleTap(_ sender: UITapGestureRecognizer? = nil) {
if open {
heightContraint.constant = 45
} else {
heightContraint.constant = 400
}
self.setNeedsLayout() // <------ IR
UIView.animate(withDuration: 1) {
self.layoutIfNeeded()
}
open = !open
}
}
Переключатель коробки находится в функции handleTap()
В моем контроллерея создаю представление следующим образом:
let boxView = FittoBoxView()
stackView.insertArrangedSubview(boxView, at: 1)
let height = boxView.heightAnchor.constraint(equalToConstant: 100)
height.isActive = true
boxView.registerView(with: height)
Почему, когда я использую setNeedLayout, представление скачет? И ярлыки не анимированные
Как сделать анимацию или просто тело коробки имеет место в анимации?