2017-01-06 3 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 지연, 0.8 + 0.8, 세 번째 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() 
    }) 
} 
관련 문제