Swift imageView 动画不起作用

Swift imageView animation doesn't work

我有创建动画的代码:

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 没有显示。

试试这个..

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

如果你想为约束设置动画,你可以使用这个

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() 
}

您应该在动画块之前设置约束的常量,并在内部调用 layoutIfNeeded

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

UIView.animate(withDuration: 10) {
    self.layoutIfNeeded()
}

在动画块中有些东西是有意义的(此处:UIView.animate)。创建更新的图像视图不是其中之一。 addSubView.

也不是

问题是您完全重新分配给您的 imageview 变量 - 在动画块中创建一个新变量。

您应该在执行 UIView.animate.

之前创建图像视图并将其完全添加到主视图

动画是改变对象的可见属性,而不是重新创建它们。如果你想改变帧,只需在动画块中执行以下操作:

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

您也可以根据您的约束要求调用layoutSubviews()layoutIfNeeded(),在UIView.animate.

你的问题在哪里

问题 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 块不需要这些东西。关于动画你应该学习的东西很少。 How animation works

解决方法:
试试这些代码行。

    // 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()
    }

希望,它会成功!