2017-02-20 7 views
1

アイテムにギャラリーの画像URLを取得し、URLデータでimageViewを作成し、この画像ビューを追加してビューのサブビューをスクロールし、スクロールビューのサブビューをスクロールします。私のimageView配列にはimageViewが6つありますが、画像ビューの画像は空です。私のスクロールビューのページングは​​うまく動作しますが、スクロールビューの画像は1つしか表示されません。私のコードがあります。その後、WEBSERVICEからの取得データでURLから画像をダウンロードしてスクロールビューのサブビューに追加する

URLの配列を作成し、getImageDataを呼び出すには、この問題を解決する方法

func getImageData() { 

    self.defaultImage.isHidden = true 
    self.scrollView.isHidden = false 
    scrollView.isPagingEnabled = true 
    scrollView.showsVerticalScrollIndicator = true 
    scrollView.showsHorizontalScrollIndicator = false 
    scrollView.isScrollEnabled = true 
    self.scrollView.willRemoveSubview(defaultImage) 
    for i in gallaryURL { 
     self.downloadImage(string: i)  
    } 
    Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(moveToNextPage), userInfo: nil, repeats: true) 

} 

func downloadImage(string: String) { 

    let imageUrl:URL = URL(string: string)! 
    // Start background thread so that image loading does not make app unresponsive 
    DispatchQueue.global(qos: .background).async { 
    let imageData:NSData = NSData(contentsOf: imageUrl)! 
    let myImageView = UIImageView(frame: CGRect(x:self.scrollWith!*2, y:0,width:self.scrollWith!, height:self.scrollHeight!)) 
    myImageView.backgroundColor = #colorLiteral(red: 0.9568627477, green: 0.6588235497, blue: 0.5450980663, alpha: 1) 
    let image = UIImage(data: imageData as Data) 
    myImageView.image = image 
    // When from background thread, UI needs to be updated on main_queue 
    DispatchQueue.main.async { 
    self.allImage.append(myImageView) 
    self.scrollView.addSubview(myImageView) 
    self.scrollView.contentSize = CGSize(width:self.scrollView.frame.width * 4, height:self.scrollView.frame.height) 
     } 
    } 

func moveToNextPage() { 

    let pageWidth:CGFloat = self.scrollView.frame.width 
    let maxWidth:CGFloat = pageWidth * 4 
    let contentOffset:CGFloat = self.scrollView.contentOffset.x 
    var slideToX = contentOffset + pageWidth 
    if contentOffset + pageWidth == maxWidth{ 
     slideToX = 0 
    } 
    self.scrollView.scrollRectToVisible(CGRect(x:slideToX, y:0, width:pageWidth, height:self.scrollView.frame.height), animated: true) 
} 

をmehtod?

+0

あなたのプロジェクトを添付することができます –

+0

これは非常に大きなプロジェクトです。この小さな部分ですから、このセクションの例を作成します。 – ava

+0

okサンプルプロジェクトを添付してください –

答えて

0

私はあなたの問題は、このラインであると思う:

let myImageView = UIImageView(frame: CGRect(x:self.scrollWith!*2, y:0,width:self.scrollWith!, height:self.scrollHeight!)) 

あなたはImageViewのすべてが同じpotsitionのxは、彼らは位置self.scrollWith!*2が重複している作ります。

あなたは、次のようなあなたのdownloadImage機能でindexまたはpositionなどの気にいらないというパラメータを追加することができます

func downloadImage(string: String, index: Int) { 

    let imageUrl:URL = URL(string: string)! 
    // Start background thread so that image loading does not make app unresponsive 
    DispatchQueue.global(qos: .background).async { 

    let imageData:NSData = NSData(contentsOf: imageUrl)! 

    let myImageView = UIImageView(frame: CGRect(x:self.scrollWith!*index, y:0,width:self.scrollWith!, height:self.scrollHeight!)) 
    myImageView.backgroundColor = #colorLiteral(red: 0.9568627477, green: 0.6588235497, blue: 0.5450980663, alpha: 1) 

    let image = UIImage(data: imageData as Data) 
    myImageView.image = image 

    // When from background thread, UI needs to be updated on main_queue 
    DispatchQueue.main.async { 

     self.allImage.append(myImageView) 

     self.scrollView.addSubview(myImageView) 


     self.scrollView.contentSize = CGSize(width:self.scrollView.frame.width * 4, height:self.scrollView.frame.height) 

    } 
} 

をそしてあなたは、次のようなforループを使用することができます。

func getImageData() { 

    self.defaultImage.isHidden = true 
    self.scrollView.isHidden = false 
    scrollView.isPagingEnabled = true 
    scrollView.showsVerticalScrollIndicator = true 
    scrollView.showsHorizontalScrollIndicator = false 
    scrollView.isScrollEnabled = true 
    self.scrollView.willRemoveSubview(defaultImage) 

    for i in 0..<gallaryURL.count { 

     self.downloadImage(string: gallaryURL[i], index: i) 

    } 

    Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(moveToNextPage), userInfo: nil, repeats: true) 

} 

希望をソリューションはあなたのために働くことができます。

+0

これにより改善されましたが、基本的には問題は解決されません。 5枚の写真があるときは、5枚のうち4枚しか表示されず、最後のものを見るためにスクロールできません。 – ava

+0

サンプルコードには、応答jsonが0、 のような何かのエラーがありますが、これは 'ScrollPagingViewController.swift'の' line 125'でこれを使用します: 'let arrJSON = response.result as! [String:Any] ' 正しいサンプルを入力してください – Leo

関連する問題