Свернуть и развернуть анимацию UIImageView, используя ограничения - PullRequest
0 голосов
/ 28 октября 2019

Как вы можете видеть в моем коде ниже, я пытаюсь сделать анимацию сворачивания / разворачивания, используя ограничения. Конечно, серый фон имеет анимацию сгиба / раскрытия, но само изображение не имеет.

Как получить такой же эффект сгиба / раскрытия самого изображения?

class ViewController2: UIViewController {
    var folded: Bool = false
    var imagen: UIImageView!
    private var foldConstraint: NSLayoutConstraint!
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        let imagen = UIImageView(contentMode: .scaleAspectFill, image: #imageLiteral(resourceName: "gpointbutton"))
        imagen.translatesAutoresizingMaskIntoConstraints = false
        imagen.backgroundColor = .gray
        view.addSubview(imagen)
        self.imagen = imagen
        imagen.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        imagen.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        foldConstraint = imagen.heightAnchor.constraint(equalToConstant: 0)
        createAnimationButton()
    }
    private func createAnimationButton() {
        let button = UIButton(title: "Animate", titleColor: .blue)
        button.translatesAutoresizingMaskIntoConstraints = false
        button.addAction(for: .touchUpInside) { [weak self] (_) in
            guard let self = self else { return }
            self.folded = !self.folded
            if self.folded {
                self.foldConstraint.isActive = true
                UIView.animate(withDuration: 0.5) {
                    self.imagen.setNeedsLayout()
                    self.imagen.superview?.layoutIfNeeded()
                }
            } else {
                self.foldConstraint.isActive = false
                UIView.animate(withDuration: 0.5) {
                    self.imagen.setNeedsLayout()
                    self.imagen.superview?.layoutIfNeeded()
                }
            }
        }
        view.addSubview(button)
        button.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        button.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
    }
}

1 Ответ

1 голос
/ 29 октября 2019

Здесь следует отметить, что ограничение width или height установлено на 0 (точно также включает 0.1), и то же самое скрыто.

Тогда вам нужноустановите ограничение height, которое будет больше, чем 0.1

foldConstraint = imagen.heightAnchor.constraint(equalToConstant: 0)

Замените на это, временно установите значение 1

foldConstraint = imagen.heightAnchor.constraint(equalToConstant: 1)

Скрыть его в конце анимации

        self.folded = !self.folded
        if self.folded {
            self.foldConstraint.isActive = true
            UIView.animate(withDuration: 1, animations: {
                self.imagen.setNeedsLayout()
                self.imagen.superview?.layoutIfNeeded()
            }) { (completion) in
                self.imagen.isHidden = true
            }
        } else {
            self.imagen.isHidden = false
            self.foldConstraint.isActive = false
            UIView.animate(withDuration: 1, animations: {
                 self.imagen.setNeedsLayout()
                 self.imagen.superview?.layoutIfNeeded()
             })
        }

Обновление:

scaleAspectFill не подходит для анимации, его следует установить на scaleAspectFit

let imagen = UIImageView(contentMode: .scaleAspectFit, image: #imageLiteral(resourceName: "gpointbutton"))

...