从URL下载图片并添加到滚动视图子视图

问题描述:

我想要当我的项目有图库获取图像URL并创建imageView与URL数据并添加此图像视图滚动视图子视图,并滚动视图子视图之间滚动。我的imageView数组有6个imageView,但图像视图图像是空的,我的滚动视图分页工作正常,但只有一个图像显示在滚动视图中其他图像视图图像是白色背景。有我的代码。从URL下载图片并添加到滚动视图子视图

在获取数据从web服务创建网址的数组,然后调用getImageData mehtod

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) 
} 

如何解决这个问题呢?

+0

可以附上你的项目 –

+0

这是一个非常大的项目,这个小部分,我将以这个部分为例。 – ava

+0

ok附上示例项目 –

我觉得你的问题是在这条线:

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

你让所有的ImageView的是一样的potsition X,它们是重叠的位置self.scrollWith!*2

你可以像下面的downloadImage功能添加一个名为财产以后像indexposition参数:

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张照片时,只显示4张照片,而我无法向下滚动查看最后一张照片。 – ava

+0

您的示例代码有错误,如响应json是0, ,但您在'ScrollPagingViewController.swift'中的'125行'处使用此代码: 'let arrJSON = response.result as! [字符串:任意]' 请提供正确的样本 – Leo