【问题标题】:How to load array of images with custom delay into splash screen Swift 3 Xcode 8?如何将具有自定义延迟的图像数组加载到启动屏幕Swift 3 Xcode 8中?
【发布时间】:2017-01-06 08:01:22
【问题描述】:

我想在应用程序向用户显示其视图之前加载一组图像,自定义延迟例如 5 毫秒。 有什么帮助吗??

我在 UIViewController 中使用了 UIImageView,这是我的代码:

import UIKit

class CustomViewController: UIViewController {


@IBOutlet weak var imageView: UIImageView!

var logoImage: [UIImage] = [
    UIImage(named: "splash_logo_1.png")!,
    UIImage(named: "splash_logo_2.png")!,
    UIImage(named: "splash_logo_3.png")!,
    UIImage(named: "splash_logo_4.png")!,
    UIImage(named: "splash_logo_5.png")!,
    UIImage(named: "splash_logo_6.png")!,
    UIImage(named: "splash_logo_7.png")!,
    UIImage(named: "splash_logo_8.png")!,
    UIImage(named: "splash_logo_9.png")!,

]

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.8 , execute: {
        // Put your code which should be executed with a delay here
        for i in 1..<self.logoImage.count
        {
            let image = self.logoImage[i]
            self.imageView.image = image
        }
    })

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

构建应用后,它只显示最后一张图片 (plash_logo_9.png)。

那么问题出在哪里..?

【问题讨论】:

    标签: swift3 xcode8 ios10 splash-screen dynamic-splash-screen


    【解决方案1】:

    //试试这个,

    override func viewDidLoad() {
        super.viewDidLoad()
    
        imageView.tag = 0
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.8 , execute: {
            self.changeImage()
        })
    }
    
    func changeImage() {
        let image = self.logoImage[imageView.tag]
        self.imageView.image = image
    
        imageView.tag += 1
        if imageView.tag == logoImage.count {
            //stop the animation
            //Show its views to user
            return
        }
    
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.8 , execute:
        {
            self.changeImage()
        })
    }
    

    【讨论】:

      【解决方案2】:

      您开始为用户显示图像的时间过早。 viewDidLoad 仅表示您的 viewController 已加载到内存中,并准备好进行初始设置,但是,它对用户不可见。

      为了使演示文稿对用户可见,我建议在viewDidAppear 中开始显示它,并且只在viewDidLoad 中设置第一张图片。

      最后,您应该更改fordispatch 调用顺序。 您需要创建尽可能多的调度块,延迟不断增加,与您拥有的图像一样多。

      所以,删除 viewDidLoad 并替换为:

       override func viewDidAppear(_ animated: Bool) {
              super.viewDidAppear(animated)
      
              var delay: Double = 0 
              for i in 0..<self.logoImage.count {
                  DispatchQueue.main.asyncAfter(deadline: .now() + delay, execute: {
                      // Put your code which should be executed with a delay here
                      let image = self.logoImage[i]
                      self.imageView.image = image
                  })
                  delay += 0.8
              }
          }
      

      此外,我建议阅读有关viewControllers lifecycle 的更多信息。

      【讨论】:

      • 我把我的代码放在 viewDidAppear 中,第一张图片放在 viewDidLoad 中,但还是同样的问题。
      • 感谢@dirtydanee,但是当我成功(延迟 =0.8)时,你做了什么(延迟 += 0.8),节目很快就疯了?
      • 好吧,如果你不增加延迟,那么每个调度队列都会同时被触发。距离now() 正好 0.8 秒。但是,如果您不断增加队列之间的延迟,则第一个队列将以 0.8 延迟触发,第二个以 0.8 + 0.8 触发,第三个 1.6+0.8 等...所以这样,您将看到图像随着一定的延迟。加速下降,减缓上升0.8,但始终保持相加。
      • 我把它设为 0.01 它很快,但我不知道有什么东西在切帧,有什么建议吗?
      • 砍帧是什么意思?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多