Swift imageView анимация не работает - PullRequest
0 голосов
/ 02 июля 2018

У меня есть код для создания анимации:

var imageView: UIImageView!

override func viewDidLoad() {
    super.viewDidLoad()

    imageView = UIImageView(frame:CGRect(x: 10, y: 10, width: 10, height: 10))
    imageView.image = UIImage(named:"2.png")

    UIView.animate(withDuration: 5) {

        self.imageView = UIImageView(frame:CGRect(x: 10, y: 10, width: 500, height: 500))

        self.view.addSubview(self.imageView)
        self.view.layoutIfNeeded()

        }
    }

Но анимация не работает. И imageView не показывает.

Ответы [ 5 ]

0 голосов
/ 03 июля 2018

Где ваша проблема

Задача 1

imageView = UIImageView(frame:CGRect(x: 10, y: 10, width: 10, height: 10))
imageView.image = UIImage(named:"2.png")

Здесь вы создали новый экземпляр представления изображения, который никогда не был добавлен в стек представления viewcontroller. Вы должны добавить это представление в стек. Эти строки кода не влияют на производительность анимации.

Задача 2

UIView.animate(withDuration: 5) {

    self.imageView = UIImageView(frame:CGRect(x: 10, y: 10, width: 500, height: 500))

    self.view.addSubview(self.imageView)
    self.view.layoutIfNeeded()

    }
}

Вы инициализировали другое изображение и добавили его в качестве подпредставления. Этот вид изображения не имеет изображения или фона, и в результате вы не видите ничего, что происходит на экране устройства. Вы не должны делать эти вещи здесь. Блок View.animate не нуждается в этих вещах. Немного вещей, которые вы должны узнать об анимации. Как работает анимация

Решение
Вместо этого попробуйте эти строки кода.

    // initial frame
    var frame:CGRect = CGRect(x: 10, y: 10, width: 10, height: 10)

    // create imageview and add this into view stack
    self.imageView = UIImageView(frame:frame)
    self.imageView.image = UIImage(named:"2.png")
    self.view.addSubview(self.imageView)

    // set new height & width
    frame.size.width = 500;
    frame.size.height = 500;

    // animate view
    UIView.animate(withDuration: 5) {
        self.imageView.frame = frame;
        self.view.layoutIfNeeded()
    }

Надеюсь, это сработает!

0 голосов
/ 02 июля 2018

Есть вещи, которые имеют смысл в анимационном блоке (здесь: UIView.animate). Создание более нового представления изображения не является одним из них. Ни один не addSubView.

Проблема в том, что вы полностью переназначаете переменную imageview - создаете новую в анимационном блоке.

Вы должны создать вид изображения и полностью добавить его в основной вид, прежде чем выполнить UIView.animate.

Анимация - это изменение видимых свойств ваших объектов , а не их воссоздание. Если вы хотите изменить кадр, просто сделайте следующее в анимационном блоке:

self.imageView.frame = CGRect(x: 10, y: 10, width: 500, height: 500)

Вы также можете позвонить layoutSubviews() или layoutIfNeeded() в зависимости от ваших требований ограничения, в пределах UIView.animate.

0 голосов
/ 02 июля 2018

, если вы хотите анимировать ограничения, чем вы можете использовать это

self.imageViewWidth.constant = 500
self.imageViewHeight.constant = 500;              
UIView.animate(withDuration: 10) {
     // if you are doing this in View controller then
 self.view.layoutSubviews()
     // if you are doing this in View then
     self.layoutSubviews() 
}
0 голосов
/ 02 июля 2018

Вы должны установить константу ограничения перед блоком анимации, а внутри просто вызвать layoutIfNeeded

self.imageViewWidth.constant = 500
self.imageViewHeight.constant = 500

UIView.animate(withDuration: 10) {
    self.layoutIfNeeded()
}
0 голосов
/ 02 июля 2018

Попробуйте это ..

UIView.animate(withDuration: 10) {

    self.imageViewWidth.constant = 500
    self.imageViewHeight.constant = 500
    self.view.updateConstraintsIfNeeded()
    self.view.layoutIfNeeded()

    }

Чтобы уменьшить и увеличить размер, вы должны использовать обработчик завершения

UIView.animate(withDuration: 2, animations: {
        self.imageViewWidth.constant = 10
        self.imageViewHeight.constant = 10
        self.view.layoutIfNeeded()
    }) { (true) in
        UIView.animate(withDuration: 10, animations: {
            self.imageViewWidth.constant = 500
            self.imageViewHeight.constant = 500
            self.view.layoutIfNeeded()
        })
    }

, если вы хотите, чтобы уменьшение началось немедленно, измените первое значение withDuration на 0

.
...