UITableViewCells停止X细胞后正确显示

UITableViewCells停止X细胞后正确显示

问题描述:

雨燕4 + Xcode的9UITableViewCells停止X细胞后正确显示

我一直在这个问题上几个星期,试图解决它自己。我希望任何人都可以提供帮助。我没有在我最初的问题中发布任何代码,因为它是专有的。如果需要帮助解决我的问题,我会很乐意提供。

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

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

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

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

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 
} 
+0

可以请你分享一下pic @ joel –

+0

听起来好像你可能因为单元重用而有额外的约束。你在做什么来确保当一个单元格被重用时删除了添加的任何约束条件?你如何更新纵横比约束? – vacawama

+0

添加到@vacawama所说的内容:这听起来很像是单元重用问题。罪魁祸首可能在你的'prepareForReuse'方法中。这应该重置每个被重用到原始状态的单元。 – Gereon

对于任何涉及到谁这个问题,因为完全缺乏对这个问题的解决方法,我得出的结论是UIKit中是不适合我的目的。我用Texture(以前称为AsyncDisplayKit)去了,我的进度已经恢复。