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

Posted

技术标签:

【中文标题】从 URL 下载图像并添加到滚动视图子视图【英文标题】:Download image from URL and add to scrollview subviews 【发布时间】: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)

如何解决这个问题?

【问题讨论】:

你能附上你的项目吗 这是一个很大的项目,只是其中的一小部分,我将在这部分做一个例子。 ok 附上示例项目 @anbu.Karthik 示例项目链接:dropbox.com/s/savxdth6cv6y41s/sampleScroll.xcodeproj.zip?dl=0 您的项目未正确附加检查一次 【参考方案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] 请提供正确的示例

以上是关于从 URL 下载图像并添加到滚动视图子视图的主要内容,如果未能解决你的问题,请参考以下文章

将图像从滚动视图拖动到视图而不会影响其位置

IOS:在滚动视图中添加一些子滚动视图,图像不出现

在作为子视图添加的滚动视图中将触摸事件传递给 uiimageview

ContentView (SwiftUI) 的背景图像不是子视图,但具有正确的滚动行为

从服务器获取多个 url 图像并在 iphone 的滚动视图中显示

将 UIButtons 添加为子视图时 UIScrollView 不滚动