Как загрузить массив изображений с произвольной задержкой в заставку Swift 3 Xcode 8?
Я хочу загрузить массив изображений до того, как приложение покажет пользователю свои виды, с пользовательской задержкой, например, 5 миллисекунд. любая помощь??
Я использовал UIImageView в UIViewController, и это мой код:
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).
так в чем проблема..?
2 ответа
Вы начинаете отображать изображения слишком рано для пользователя. 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.
//Попробуй это,
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()
})
}