UITableViewCells在X单元格后停止正确显示

时间:2017-11-18 12:41:36

标签: ios swift uitableview

Swift 4 + Xcode 9。

我已经在这个问题上工作了好几个星期,试图自己解决这个问题。我很感激任何人都可以提供的任何帮助。我没有在我的初始问题中发布任何代码,因为它是专有的。如果需要帮助解决我的问题,我将很乐意提供它。

我有一个UITableView个自定义单元格,其中包含一个非常复杂的子视图布局,其中一些是隐藏或显示的(使用1000-priority height=0约束添加和删除在cellForRowAt期间,取决于数据。还有ImageView应始终为全宽,并应更改高度以匹配通过Kingfisher.shared.retrieveImage()加载的图像。获得图像后,我会更新该单元格图像上的aspectRatio约束,并显示单元格。这适用于前15-20个单元格,但当我滚动更多行时,它只是停止运行。图像很小且居中,某些数据字段没有更新等。如果我继续滚动,有时单元格会在这里和那里正常运行,但几乎所有都没有。

现在有趣的部分:如果我向上滚动,每个单元格会自动重新格式化,看起来应该是这样,之后,每个单元格都是完美的。代码显然有效 - 我觉得这可能是平台中的一个错误,但在我假设之前,我想知道是否有其他人遇到过类似的事情。

再次感谢您提供的任何帮助 - 我非常渴望解决这个问题。

更新:要回答几个问题,这里有一段代码,它是自定义单元类的一部分。这就是我设置单元格图像的方式(包括更新宽高比约束),以及如何重置单元格以便重复使用。

internal var aspectConstraint : NSLayoutConstraint? {
    didSet {
        if oldValue != nil {
            imageView.removeConstraint(oldValue!)
        }
        if aspectConstraint != nil {
            imageView.addConstraint(aspectConstraint!)
        }
    }
}

override func prepareForReuse() {
    super.prepareForReuse()
    aspectConstraint = nil
    imageView.image = nil
    for view in subviews {
        for c in view.constraints {
            if c.firstAttribute == NSLayoutAttribute.height && c.constant == 0 {
                view.removeConstraint(c)
            }
        }
    }
}

func setCustomImage(image : UIImage) {
    let aspect = image.size.width / image.size.height
    let constraint = NSLayoutConstraint(item: imageView, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: imageView, attribute: NSLayoutAttribute.height, multiplier: aspect, constant: 0.0)
    constraint.priority = UILayoutPriority(999)
    aspectConstraint = constraint
    imageView.image = image
}

1 个答案:

答案 0 :(得分:0)

对于这个问题的任何人,由于在这个问题上完全没有解决方案,我得出结论,UIKit不适合我的目的。我选择了Texture(以前的AsyncDisplayKit),我的进度已经恢复。