Как загрузить массив изображений с произвольной задержкой в ​​заставку 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()
    })
}
Другие вопросы по тегам