【问题标题】:Download image from URL and add to scrollview subviews从 URL 下载图像并添加到滚动视图子视图
【发布时间】:2017-02-20 07:59:19
【问题描述】:

我想当我的项目有画廊时获取图像 url 并使用 url 数据创建 imageView 并将此图像视图添加到滚动视图子视图,并在滚动视图子视图之间滚动。我的 imageView 数组有 6 个 imageView,但图像视图图像是空的,我的滚动视图分页运行良好,但滚动视图中只显示一个图像,其他图像视图图像是白色背景。有我的代码。

在从 webService 获取数据中创建 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)
}

如何解决这个问题?

【问题讨论】:

标签: ios swift xcode uiscrollview


【解决方案1】:

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

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

你让所有的 ImageView 都是同一个位置 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)

}

希望解决方案对您有用。

【讨论】:

  • 这让它变得更好了,但基本上问题没有解决。当有 5 张图片时,它只显示 5 张中的 4 张,我无法向下滚动查看最后一张。
  • 您的示例代码有一些错误,例如响应 json 为 0,但您在 line 125 in ScrollPagingViewController.swift 中使用此代码:let arrJSON = response.result as! [String:Any] 请提供正确的示例
猜你喜欢
  • 2013-03-12
  • 1970-01-01
  • 2019-07-04
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多