Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.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
Ios 在UIImageView中尝试在图像之间淡入时出现白色屏幕_Ios_Swift_Image_Uiimageview_Uiviewanimation - Fatal编程技术网

Ios 在UIImageView中尝试在图像之间淡入时出现白色屏幕

Ios 在UIImageView中尝试在图像之间淡入时出现白色屏幕,ios,swift,image,uiimageview,uiviewanimation,Ios,Swift,Image,Uiimageview,Uiviewanimation,我试图通过使用UIImageView和设置过渡动画在两个图像之间平滑过渡,但过渡似乎没有按照预期工作,因为出现了一个白色屏幕,而不是新图像淡入 我用过参考资料,不知道哪里出了错: 类ViewController:UIViewController{ var bckgImageView=UIImageViewimage:UIImageName:one 覆盖func viewDidLoad{ super.viewDidLoad bckgImageView.frame=self.view.frame s

我试图通过使用UIImageView和设置过渡动画在两个图像之间平滑过渡,但过渡似乎没有按照预期工作,因为出现了一个白色屏幕,而不是新图像淡入

我用过参考资料,不知道哪里出了错:

类ViewController:UIViewController{ var bckgImageView=UIImageViewimage:UIImageName:one 覆盖func viewDidLoad{ super.viewDidLoad bckgImageView.frame=self.view.frame self.view.addSubviewbckgImageView 动画背景 } 动画背景{ UIView.transitionwith:self.view, 持续时间:5, 选项:。传递交叉溶解, 动画:{self.bckgImageView.image=uiImageName:two}, 完成日期:无 }
在viewDidLoad中时尚未计算自动布局

可以在ViewDidLayoutSubView中更改布局时设置框架。 试试这个

class ViewController: UIViewController {

    var bckgImageView = UIImageView(image: UIImage(named: "one"))

    override func viewDidLoad() {
        super.viewDidLoad()

        bckgImageView.frame = self.view.frame
        self.view.addSubview(bckgImageView)

        animateBackground()

    }

    func animateBackground() {

        UIView.transition(with: self.view,
                          duration: 5,
                          options: .transitionCrossDissolve,
                          animations: { self.bckgImageView.image = UIImage(named: "two") },
                          completion: nil)

    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        bckgImageView.frame = self.view.frame
    }

}

首先,将图像视图的框架设置为根视图的框架,这在viewDidLoad中还没有定义。使用约束并让自动布局调整视图的大小要好得多

其次,如果要在viewDidLoad甚至viewDidLayoutSubviews中启动动画,则屏幕还不可见,因此您看不到初始图像,或者如果动画很短,您只能看到非常短暂的图像

因此,请在ViewDidDisplay开始动画,或者稍微延迟一点,如下所示:

class ViewController: UIViewController {

    var bckgImageView = UIImageView(image: UIImage(named: "one"))

    override func viewDidLoad() {
        super.viewDidLoad()

        self.view.addSubview(bckgImageView)
        bckgImageView.translatesAutoresizingMaskIntoConstraints = false

        // constrain image view to all 4 sides
        NSLayoutConstraint.activate([
            bckgImageView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
            bckgImageView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
            bckgImageView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
            bckgImageView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor),
            ])

    }

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

        // start animation after 1 second
        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0, execute: {
            self.animateBackground()
            })

    }

    func animateBackground() {

        UIView.transition(with: self.view,
                          duration: 5,
                          options: .transitionCrossDissolve,
                          animations: { self.bckgImageView.image = UIImage(named: "two") },
                          completion: nil)

    }
}

self.view的大小是否正确?您可以将此代码移动到ViewDidDisplay中进行测试。这在一定程度上起作用:,第二个图像正在显示,但没有动画,并且初始图像永远不会显示检查约束并放置动画DidDisplay。确保您的插座和图像在捆绑包中