Swift: анимация растяжения и сжатия изображения - PullRequest
1 голос
/ 09 мая 2019

Я пытаюсь анимировать растяжение и сжатие светового меча в моем приложении. В настоящее время у меня все работает, кроме растяжения / сжатия светового меча.

В идеале, я бы хотел, чтобы нижний якорь реальной сабли был заподлицо под верхним якорем рукоятки сабли. Мне удалось добиться некоторых успехов с ограничениями Auto Layout. Однако я изо всех сил пытаюсь найти правильный код для анимации. Как вы можете видеть из моего кода, я попробовал frame.size.height / width, однако он перемещает только кадр сабли (не дескриптор). Строка с frame.size.height достигает того, что я хочу, с точки зрения ее растягивания / роста, но это очень простой способ сделать это.

Текущий метод frame.size.height / width только смещает изображения, как мне добиться возможности растягивать / сжимать? Можно ли этого добиться с помощью функции умножения из ограничений Auto Layout?

@objc func lightsaberTapped() {
    print("lightsaber open!")

    if mainView.saberImage.isHidden == true {
        mainView.saberImage.isHidden = false
        UIView.animate(withDuration: 0.5, animations: {

            self.mainView.saberImage.frame.size.height -= 500
//          self.mainView.saberImage.frame.size.width += 20

            }, completion: nil)
        lightsaberModel.turnSaberOnAudio.play()
    } else {
        mainView.saberImage.isHidden = true
        UIView.animate(withDuration: 0.5, animations: {

            self.mainView.saberImage.frame.size.height += 500
//          self.mainView.saberImage.frame.size.width += 20

        }, completion: nil)
    }
}

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Сначала добавьте ограничения для ширины и высоты

 @IBOutlet weak var saberImageHeightConstraint: NSLayoutConstraint!
 @IBOutlet weak var saberImageWidthConstraint: NSLayoutConstraint!

Попробуйте получить анимацию при изменении размера кадра.

if mainView.saberImage.isHidden == true 
{
    mainView.saberImage.isHidden = false
    self.saberImageHeightConstraint.constant -= 500
    UIView.animate(withDuration: 0.5, animations: {
        self.view.layoutIfNeeded()    
        self.viewDidLayoutSubviews()    
    }, completion: nil)

    lightsaberModel.turnSaberOnAudio.play()
} 
else 
{
    mainView.saberImage.isHidden = true
    self.saberImageHeightConstraint.constant += 500
    UIView.animate(withDuration: 0.5, animations: {
        self.view.layoutIfNeeded()
        self.viewDidLayoutSubviews()
    }, completion: nil)
}
0 голосов
/ 09 мая 2019

Ваша главная проблема - это анимация кадров, когда у вас есть ограничения, вам нужно 1 из 2 или анимировать ограничения или удалить их и анимировать с помощью свойства frame, в этом случае вам нужно убедиться, что ваш UIImageView добавлен с translatesAutoresizingMaskIntoConstraints = false

Для анимации ширины и высоты в системе Autolayout необходимо получить ссылку на ограничение как IBOutlet и анимировать свойство константы внутри блока анимации,

, это очень маленький пример

class ViewController: UIViewController {
    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var imageHeightConstraint: NSLayoutConstraint!
    @IBOutlet weak var imageWidthConstraint: NSLayoutConstraint!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

    }
    @IBAction func action(_ sender: Any) {
        UIView.animate(withDuration: 0.5, animations: {
            self.imageHeightConstraint.constant = self.imageHeightConstraint.constant - 10
            self.imageWidthConstraint.constant = self.imageWidthConstraint.constant - 10
            self.view.layoutIfNeeded()
        })
    }

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