滚动时为什么我的tableVeiws行如此跳跃?

时间:2018-01-25 03:45:43

标签: ios swift uitableview

下面是我的tableView控制器的代码,它从UIImage数组中获取图像,将其调整为宽高比并在屏幕上显示。虽然我滚动图像非常不稳定?无论如何都要减少波动?

import UIKit

class TableViewController: UITableViewController {

var images = imagePost.defaultimages //An array of a class containing images
var indexPathPass = IndexPath(row: 0, section: 0)

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.rowHeight = UITableViewAutomaticDimension
    tableView.estimatedRowHeight = 100
    tableView.backgroundColor =  colors.backgroundColor
    DispatchQueue.main.async {
        self.tableView.scrollToRow(at: self.indexPathPass, at: .top, animated: false)
    }
}

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

    // Configure the cell...

        cell.cellImageView.image = self.images[indexPath.row].image
    cell.cellImageView.image = cell.cellImageView.image?.resizeImageWith()

    cell.backgroundColor =  UIColor(displayP3Red: 0, green: 20, blue: 1, alpha: 0.99)
    cell.layer.shouldRasterize = true
    return cell
        }

override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
     return 100
 }
    }

2 个答案:

答案 0 :(得分:0)

检查 estimatedRowHeight 与actualRowHeight之间的差异,差异越大,滚动时跳跃的次数就越多。

答案 1 :(得分:0)

解决方案1。

  • 如果可能的话,尝试在indexPath'处实现' heightForItem方法。并返回计算高度

解决方案2。

  • 您可以实现高度缓存机制。如下面的代码。

    class TableViewController:UITableViewController {

    var images = imagePost.defaultimages //An array of a class containing images
    var indexPathPass = IndexPath(row: 0, section: 0)
    
    fileprivate var cachedHeight = [IndexPath: CGFloat]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.rowHeight = UITableViewAutomaticDimension
        tableView.estimatedRowHeight = 100
        tableView.backgroundColor =  colors.backgroundColor
        DispatchQueue.main.async {
            self.tableView.scrollToRow(at: self.indexPathPass, at: .top, animated: false)
        }
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! TableViewCell
    
        // Configure the cell...
    
        cell.cellImageView.image = self.images[indexPath.row].image
        cell.cellImageView.image = cell.cellImageView.image?.resizeImageWith()
    
        cell.backgroundColor =  UIColor(displayP3Red: 0, green: 20, blue: 1, alpha: 0.99)
        cell.layer.shouldRasterize = true
        return cell
    }
    
    override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
        return cachedHeight[indexPath] ?? 100
    }
    
    override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        cachedHeight[indexPath] = cell.frame.height
    }
    

    }