UITableView在初始加载时无法正确绘制单元格-Swift

时间:2018-12-17 02:35:41

标签: ios swift uitableview

我在nib文件中有一个表视图,它可以正确加载数据。它会加载所需数量的单元格并正确填写数据。该单元格也是一个xib文件,其中包含多个视图。每个单元都有一个自定义的高度。我设法使用以下方法设置了每个单元格的正确高度:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return (data[indexPath.row].height + 200)
}

问题在于,在初始加载时,像这样无法正确绘制单元格: Initial load image

描述区域不会移动到我通过更改其X和Y坐标使其移动的位置。

但是,当我将表格视图滚动到最初加载的单元格之外并返回到它们时,该问题已得到解决,如下所示: After scrolling

加载单元格后,我将描述区域移动到图像下方。这适用于单元格,但不适用于最初加载的单元格。仅当我将破碎的单元格移出视线并返回到它们时,它才能修复。我该如何解决?我如何才能使单元在初始载荷下正确绘制?

编辑:要澄清:单元已正确加载,但绘制不正确。我必须从前几个单元格中滚动出来,然后再滚动回到它们,以便正确绘制这些单元格。

感谢您的帮助。谢谢!

2 个答案:

答案 0 :(得分:1)

我可以看到您要加载的图像的尺寸大于图像容器视图的尺寸。 您可以尝试将clipsToBound = True赋予imageView。

这很可能会解决您的问题。 谢谢。

答案 1 :(得分:0)

您要根据其中的图像来增加UITableViewCell的高度,对吧?

这是tableview数据源和委托。

扩展名MyDataSource:UITableViewDelegate,UITableViewDataSource {

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if let height = self.rowHeights[indexPath.row] {
        return height
    } else {
        return 100
    }
}

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    if let height = self.rowHeights[indexPath.row] {
        return height
    } else {
        return 100
    }
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return mydatas.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let mydata = mydatas[indexPath.row]

    var cell: UITableViewCell
    cell = tableView.dequeueReusableCell(withIdentifier: 'myCell.cellIdentify()')!
    cell.contentView.backgroundColor = UIColor.clear
    cell.backgroundColor = UIColor.clear
    cell.tag = indexPath.row
    cell.selectionStyle = .none

    let image = UIImage(named: promotion)
    (cell as! myCell).configureCell(downloadImage: image!)
    let aspectRatio = (image?.size.height)!/(image?.size.width)!
    let imageHeight = (cell.contentView.frame.width * aspectRatio) + 16

    UIView.performWithoutAnimation {
        self.myTableView?.beginUpdates()
        self.rowHeights[indexPath.row] = imageHeight
        self.myTableView?.endUpdates()
    }

    return cell
}

}

这是UITableViewCell自定义类。

myCell

import UIKit

class myCell: UITableViewCell {

    @IBOutlet weak var imageHolder: WMView!
    @IBOutlet weak var actionImage: UIImageView!
    @IBOutlet weak var loaderIndicator: UIActivityIndicatorView!

    override func prepareForReuse() {
        super.prepareForReuse()
        self.loaderIndicator.isHidden = false
        self.loaderIndicator.startAnimating()
        self.actionImage.image = nil
    }

    static func cellHeight() -> CGFloat {
        return 73.0
    }

    static func cellIdentify() ->String {
        return "myCell"
    }

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }

    func configureCell(downloadImage: UIImage) {
        self.imageHolder.layer.borderWidth = 1
        self.imageHolder.layer.cornerRadius = 5
        self.imageHolder.layer.borderColor = UIColor.clear.cgColor

        self.imageHolder.layer.masksToBounds = true
        self.imageHolder.clipsToBounds = true

        //ImageHolder
        self.actionImage.image = downloadImage
        self.loaderIndicator.isHidden = true
    }
}