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

时间:2017-02-20 07:59:19

标签: ios swift xcode uiscrollview

我希望当我的项目具有图库获取图像网址并使用网址数据创建imageView并添加此图像视图以滚动视图子视图,并在滚动视图子视图之间滚动。我的imageView数组有6个imageView,但是图像视图图像为空,我的滚动视图分页工作正常,但只是滚动视图中的一个图像显示其他图像视图图像是白色背景。有我的代码。

从webService获取数据创建url数组,然后调用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)
}

如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我认为你的问题出在这一行:

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

你使所有的ImageView都是相同的potition x,它们与位置self.scrollWith!*2重叠。

您可以在index函数中添加名为positiondownloadImage的参数,如下所示:

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)

}

希望解决方案能为您服务。