Swift: создание анимированной ошибки просмотра - PullRequest
0 голосов
/ 08 октября 2019

Я программно создал хороший кастом, выпадающий список.

Все отлично работает, кроме анимации.

Вот результат с анимацией, когда я вызываю self.setNeedsLayout()

enter image description here

А вот когда я не пользуюсь self.setNeedsLayout()

enter image description here

Мой кастомпредставление Я вставил его в стеке

Вот мой пользовательский вид:

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, представление скачет? И ярлыки не анимированные

Как сделать анимацию или просто тело коробки имеет место в анимации?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...