从 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
函数中添加一个名为 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)
希望解决方案对您有用。
【讨论】:
这让它变得更好了,但基本上问题没有解决。当有 5 张图片时,它只显示 5 张中的 4 张,我无法向下滚动查看最后一张。 您的示例代码有一些错误,例如响应 json 为 0,但您在line 125
in ScrollPagingViewController.swift
中使用此代码:let arrJSON = response.result as! [String:Any]
请提供正确的示例以上是关于从 URL 下载图像并添加到滚动视图子视图的主要内容,如果未能解决你的问题,请参考以下文章
在作为子视图添加的滚动视图中将触摸事件传递给 uiimageview
ContentView (SwiftUI) 的背景图像不是子视图,但具有正确的滚动行为