Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 为什么UIView&;UIImageView是否以不同方式设置动画?_Swift_Uiview_Uiimageview_Core Animation_Uiviewanimation - Fatal编程技术网

Swift 为什么UIView&;UIImageView是否以不同方式设置动画?

Swift 为什么UIView&;UIImageView是否以不同方式设置动画?,swift,uiview,uiimageview,core-animation,uiviewanimation,Swift,Uiview,Uiimageview,Core Animation,Uiviewanimation,我有4个按钮,都使用相同的动画功能 无延迟图像视图 带延迟的图像视图 立即查看 延迟查看 我的代码: import UIKit class ViewController: UIViewController { @IBAction func imageViewithoutDelay(_ sender: AnyObject) { let circleImage = UIImageView() // kindly add your own image.

我有4个按钮,都使用相同的动画功能

  • 无延迟图像视图
  • 带延迟的图像视图
  • 立即查看
  • 延迟查看
我的代码:

import UIKit

class ViewController: UIViewController {

    @IBAction func imageViewithoutDelay(_ sender: AnyObject) {
        let circleImage = UIImageView()
        // kindly add your own image.
        circleImage.image = UIImage(named: "empty")
        animate(inputView: circleImage, delay: false)
    }

    @IBAction func imageViewWithDelay(_ sender: UIButton) {

        let circleImage = UIImageView()
        circleImage.image = UIImage(named: "empty")
        animate(inputView: circleImage, delay: true)
    }

    func animate(inputView : UIView, delay: Bool){

        inputView.layer.cornerRadius = inputView.frame.size.width / 2
        inputView.clipsToBounds = true
        inputView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(inputView)

        let screenSize = UIScreen.main.bounds
        let screenHeight = screenSize.height * 0.10
        inputView.center.y = screenHeight
        view.setNeedsLayout()
        view.setNeedsDisplay()

        if delay == true{
        DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1), execute: {
            UIView.animate(withDuration: 2.5, animations: {
                inputView.alpha = 0.0
                let screenSize = UIScreen.main.bounds
                let screenHeight = screenSize.height * 0.10
                inputView.center.y -= screenHeight
            })
        })} else{
            UIView.animate(withDuration: 2.5, animations: {
                inputView.alpha = 0.0
                let screenSize = UIScreen.main.bounds
                let screenHeight = screenSize.height * 0.10
                inputView.center.y -= screenHeight
            })

        }

    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }

}
有趣的是
UIview
UIImageView
的不同行为

如果使用延迟,则
UIImageView
实例仅按预期(从原点向上)设置动画。但是,在不使用延迟块的情况下,UIImageView实例首先下拉,然后向上移动到其原点)

ui视图
不会显示不同的行为。它从原点开始动画并向上移动

这是虫子吗


这个问题与原来的问题是相切的。

无论你如何划分,你所做的都是错误的。不能同时添加视图和设置其动画。只能对界面中已存在的视图设置动画

这就是为什么如果添加延迟,它对图像视图有效:在设置动画时,图像视图已经进入界面,并且界面已经稳定下来


它似乎对非imageview有效的事实是愚蠢的运气。

我明白了。1.当它到达动画行时,它不是已经在界面中了吗?2.为什么会这样?我的意思是为什么它会移动?不应该有一个原因来解释为什么它不能发生,为什么它可以用于imageView。我不知道为什么它适用于非imageView。-直到runloop有机会循环,它才“在接口中”。即使延迟为零也应该足够了,因为您将在下一次运行循环中返回主线程。在您的图像视图中试用,然后查看。您的意思是更改为
。秒(0)
?我这样做了,现在我的两个图像视图都下拉下来,然后设置动画到原点。我也尝试了
.nanoseconds(1)
,但仍然得到了同样的错误结果。也许它得到了优化。我想用
DispatchQueue.async{…}
代替
asyncAfter
。或者使用my并尝试
delay(0)
——但如果这不起作用,请尝试类似
delay(.01)
的方法。让我们看看你发现了什么。。。