2017-01-06 25 views
1

アプリがビューをユーザーに表示する前に、たとえば、5ミリ秒のカスタム遅延で画像の配列をロードしたいとします。任意のヘルプ? スプラッシュ画面にカスタム遅延を持つ画像の配列を読み込む方法Swift 3 Xcode 8?

私はの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)を示しています。

だから問題はどこですか?

答えて

1

イメージを表示するタイミングが早すぎます。 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についての詳細を読むことをお勧めします。

+0

、これを試してみてください、私はviewDidAppearとのviewDidLoadの最初のイメージが、まだ同じ問題に私のコードを置きます。 –

+0

@dirtydaneeに感謝しますが、私が作ったとき(遅延= 0.8)、あなたは何をしましたか(遅延= 0.8)、ショーは狂った速さになりましたか? –

+0

まあ、遅延を増やさない場合、各ディスパッチキューは同時に起動されます。 'now()'から0.8秒です。しかし、キュー間の遅延を増やし続けると、最初のキューは0.8遅延、2番目は0.8 + 0.8、3番目の1.6 + 0.8などで起動されます。このようにして、画像は次のように変化していきます一定の遅延。減少をスピードアップするには、0.8を減速させるが、常にお互いを続けていく。 – dirtydanee

2

//

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() 
    }) 
} 
関連する問題