Swift 3 图片下载不完全
Swift 3 Image download not working fully
因此,经过 5 小时的坚定宣誓,我终于设法将我的项目从 Swift 2.2 转换为 Swift 3。事情建立了,现在一切都精明了,只有一个小例外。
由于某些原因,我的图像没有像以前那样异步下载。
我录制了一个小视频给你看,还有一些代码示例。我正在尝试 AlamofireImage 和一个普通的 ole Swift 扩展,两者都给出相同的行为。正如您在视频中看到的那样,最初图像根本不加载(我还注意到由于某种原因默认占位符图像最初不显示)当我拉动以刷新视图时它们突然出现。
如果有人看到类似的东西,如果可能的话,我将不胜感激。
视频是here
代码示例如下:
扩展函数
func downloadedFrom(url: URL, contentMode mode: UIViewContentMode = .scaleAspectFit) {
contentMode = mode
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard
let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,
let mimeType = response?.mimeType, mimeType.hasPrefix("image"),
let data = data, error == nil,
let image = UIImage(data: data)
else { return }
DispatchQueue.main.async() { () -> Void in
self.image = image
}
}.resume()
}
func downloadedFrom(link: String, contentMode mode: UIViewContentMode = .scaleAspectFit) {
guard let url = URL(string: link) else { return }
downloadedFrom(url: url, contentMode: mode)
}
另外我对一个单元格使用 AlamofireImage 只是为了测试
if nc.returnCommentDetails().image != "" {
let url = URL(string: nc.returnCommentDetails().image!)
cell.imgProfile.af_setImage(withURL: url!)
cell.imgProfile.resizeForProfilePic()
}
经过深思熟虑,我找到了问题的根本原因。
我写的用于使图像视图循环的扩展基本上有问题,通过评论图像看起来很好。
如果有人使用类似的东西,我会调查并提供替代方案:
func resizeForProfilePic(){
self.layer.borderWidth = 0.1
self.layer.masksToBounds = false
self.layer.borderColor = UIColor.black.cgColor
self.layer.cornerRadius = self.frame.height/2
self.clipsToBounds = true
}
用AlamofireImage好像已经解决了
let url = URL(string: nc.returnCommentDetails().image!)
let placeholderImage = UIImage(named: "DefaultImage")!
let size = CGSize(width: 100.0, height: 100.0)
let imageFilter = AspectScaledToFillSizeCircleFilter(size: size)
cell.imgProfile.af_setImage(withURL: url!, placeholderImage: placeholderImage, filter: imageFilter)
要解决此问题,只需在 layer.cornerRadius
之前添加此行
self.view.layoutIfNeeded()
然后所有图像都显示为第一次加载
因此,经过 5 小时的坚定宣誓,我终于设法将我的项目从 Swift 2.2 转换为 Swift 3。事情建立了,现在一切都精明了,只有一个小例外。
由于某些原因,我的图像没有像以前那样异步下载。
我录制了一个小视频给你看,还有一些代码示例。我正在尝试 AlamofireImage 和一个普通的 ole Swift 扩展,两者都给出相同的行为。正如您在视频中看到的那样,最初图像根本不加载(我还注意到由于某种原因默认占位符图像最初不显示)当我拉动以刷新视图时它们突然出现。
如果有人看到类似的东西,如果可能的话,我将不胜感激。
视频是here
代码示例如下: 扩展函数
func downloadedFrom(url: URL, contentMode mode: UIViewContentMode = .scaleAspectFit) {
contentMode = mode
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard
let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,
let mimeType = response?.mimeType, mimeType.hasPrefix("image"),
let data = data, error == nil,
let image = UIImage(data: data)
else { return }
DispatchQueue.main.async() { () -> Void in
self.image = image
}
}.resume()
}
func downloadedFrom(link: String, contentMode mode: UIViewContentMode = .scaleAspectFit) {
guard let url = URL(string: link) else { return }
downloadedFrom(url: url, contentMode: mode)
}
另外我对一个单元格使用 AlamofireImage 只是为了测试
if nc.returnCommentDetails().image != "" {
let url = URL(string: nc.returnCommentDetails().image!)
cell.imgProfile.af_setImage(withURL: url!)
cell.imgProfile.resizeForProfilePic()
}
经过深思熟虑,我找到了问题的根本原因。
我写的用于使图像视图循环的扩展基本上有问题,通过评论图像看起来很好。
如果有人使用类似的东西,我会调查并提供替代方案:
func resizeForProfilePic(){
self.layer.borderWidth = 0.1
self.layer.masksToBounds = false
self.layer.borderColor = UIColor.black.cgColor
self.layer.cornerRadius = self.frame.height/2
self.clipsToBounds = true
}
用AlamofireImage好像已经解决了
let url = URL(string: nc.returnCommentDetails().image!)
let placeholderImage = UIImage(named: "DefaultImage")!
let size = CGSize(width: 100.0, height: 100.0)
let imageFilter = AspectScaledToFillSizeCircleFilter(size: size)
cell.imgProfile.af_setImage(withURL: url!, placeholderImage: placeholderImage, filter: imageFilter)
要解决此问题,只需在 layer.cornerRadius
之前添加此行self.view.layoutIfNeeded()
然后所有图像都显示为第一次加载