为什么我的UITableView滚动对于高分辨率图像不那么平滑

问题描述 投票:0回答:1

我有一个问题,我有一组高分辨率图像显示在UITableView中。

在缓存图像时,我做的事情不正确。我也尝试和失败了AlamofireImage库的类似实现,并且似乎在两个实现中滚动都不那么顺利。

但是,如果将图像调整为较小的分辨率,则不会出现任何问题。但是我要加载具有确切分辨率的图像。

谁能告诉我这可能是什么问题吗?

代码如下:

override func viewDidLoad() {
    super.viewDidLoad()

    for i in 1000...2000{
        let url = "https://i.picsum.photos/id/\(i)/3000/2000.jpg";
        imageUrlArray.append(url)
        print(url)
    }
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "ImageCellId") as! ImageTableViewCell


        let imageUrl = imageUrlArray[indexPath.row]

        cell.imgView.image = nil
        cell.tag = indexPath.row

        if let image = imageCache.object(forKey: indexPath.row as AnyObject){
            DispatchQueue.main.async {
                cell.imgView?.image = image as? UIImage
            }
        }

        DispatchQueue.main.async {
            let data = NSData(contentsOf: URL(string: imageUrl)!)
            guard let imageData = data else{
                return
            }
            DispatchQueue.main.async {
                cell.imgView.image = UIImage(data:imageData as Data)
                imageCache.setObject(imageData, forKey: indexPath.row as AnyObject)
                print("Setting object")
            }
        }

        return cell
    }

[使用Alamofire:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "ImageCellId") as! ImageTableViewCell
    let imageUrl = imageUrlArray[indexPath.row]

    cell.imgView.image = nil
    cell.tag = indexPath.row

    Alamofire.request(imageUrl).responseData { response in

        if case .success(let image) = response.result {
            DispatchQueue.main.async {
                if(cell.tag == indexPath.row){
                    guard let imageData = UIImage(data: image)else{
                        return
                    }

                    cell.imgView.image = imageData
                }
            }
        }
    }
   return cell
  }
ios uitableview scroll freeze alamofireimage
1个回答
0
投票

无论您要获取的图像大小如何,都需要根据用户界面调整其大小。使用AlamofireImage的setImage(withURL:)即可轻松完成。

例如,在AlamofireImage 4中:

let urls = (1000...2000).compactMap { URL(string: "https://i.picsum.photos/id/\($0)/3000/2000.jpg") }
let placeholder = UIImage()
let filter: AspectScaledToFillSizeFilter = {
    let scale = UIScreen.main.scale
    let size = CGSize(width: 50 * scale, height: 50 * scale)
    return AspectScaledToFillSizeFilter(size: size)
}()

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! CustomCell

    cell.customImageView.af.setImage(withURL: urls[indexPath.row], placeholderImage: placeholder, filter: filter)

    return cell
}

此下载高分辨率图像,为图像视图适当调整其大小(在这种情况下,我的图像视图为50×50点,并进行内存中缓存。


如果要预取图像,则可以指定预取数据源:

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.prefetchDataSource = self
}

并下载图像:

extension ViewController: UITableViewDataSourcePrefetching {
    func tableView(_ tableView: UITableView, prefetchRowsAt indexPaths: [IndexPath]) {
        UIImageView.af.sharedImageDownloader.download(indexPaths.map { URLRequest(url: urls[$0.row]) })
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.