从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)
}
如何解决这个问题呢?
答
我觉得你的问题是在这条线:
let myImageView = UIImageView(frame: CGRect(x:self.scrollWith!*2, y:0,width:self.scrollWith!, height:self.scrollHeight!))
你让所有的ImageView的是一样的potsition 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)
}
希望该解决方案可以为您工作。
可以附上你的项目 –
这是一个非常大的项目,这个小部分,我将以这个部分为例。 – ava
ok附上示例项目 –