如何将具有自定义延迟的图像数组加载到启动画面 Swift 3 Xcode 8?
How to load array of images with custom delay into splash screen Swift 3 Xcode 8?
我想在应用程序向用户显示其视图之前加载一组图像,自定义延迟例如 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)。
那么问题出在哪里..?
您开始为用户显示图像的时间过早。 viewDidLoad
仅表示您的 viewController 已加载到内存中,并准备好进行初始设置,但是,它对用户不可见。
为了使演示文稿对用户可见,我建议在 viewDidAppear
中开始显示它,并且只在 viewDidLoad
中设置第一张图片。
最后,您应该更改 for
和 dispatch
调用顺序。
你需要创建尽可能多的调度块,延迟不断增加,就像你拥有的图像一样多。
因此,删除 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 的内容。
//试试这个,
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()
})
}
我想在应用程序向用户显示其视图之前加载一组图像,自定义延迟例如 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)。
那么问题出在哪里..?
您开始为用户显示图像的时间过早。 viewDidLoad
仅表示您的 viewController 已加载到内存中,并准备好进行初始设置,但是,它对用户不可见。
为了使演示文稿对用户可见,我建议在 viewDidAppear
中开始显示它,并且只在 viewDidLoad
中设置第一张图片。
最后,您应该更改 for
和 dispatch
调用顺序。
你需要创建尽可能多的调度块,延迟不断增加,就像你拥有的图像一样多。
因此,删除 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 的内容。
//试试这个,
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()
})
}