UITmageView中的UIImageView和自动布局不能用于单元重用

时间:2015-02-21 05:17:28

标签: ios objective-c iphone uitableview swift

细胞在启动时看起来正确。

滚动到新单元格(显然会调用dequeReusableCell)后,单元格中先前存在的约束将丢失。

以下是单元格中imageView的约束设置:

enter image description here

以下是应用程序启动时的样子(按照我喜欢的方式布置单元格)

enter image description here

当你开始滚动时,细胞的重复使用会扰乱约束。

在单元格上设置图像后,我在updateImage方法中调用layoutIfNeeded():

 func updateWithImage(image: UIImage) {

    userGroupPhotoImageView.layer.masksToBounds = true;
    userGroupPhotoImageView.layer.cornerRadius = 5.0;

    self.userGroupPhotoImageView.image = image
    self.layoutIfNeeded()
}

indexPath处的行的单元格:

 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as MyCell
    cell.nameLabel?.text = "Cell \(indexPath.row)"
    switch (indexPath.row) {
    case 0:
        cell.updateWithImage(UIImage(named: "group0")!)
    case 1:
        cell.updateWithImage(UIImage(named: "group1")!)
    case 2:
        cell.updateWithImage(UIImage(named: "group2")!)
    case 3:
        cell.updateWithImage(UIImage(named: "group3")!)
    case 4:
        cell.updateWithImage(UIImage(named: "group4")!)
    case 5:
        cell.updateWithImage(UIImage(named: "IMG_0184")!)
    default:
        cell.updateWithImage(UIImage(named: "IMG_0185")!)
    }

    return cell
}

开始滚动后的样子:

向下滚动:

enter image description here

向后滚动到顶部;

enter image description here

ImageView上的约束:

enter image description here

2 个答案:

答案 0 :(得分:0)

每次设置图像后都需要调用setNeedsLayout和layoutIfNeeded,并且每次重复使用时必须将ImageView.image设置为nil。 :|

class UserGroupCell: UITableViewCell {

@IBOutlet weak var userGroupNameLabel: UILabel!
@IBOutlet weak var userGroupPhotoImageView: UIImageView! {
    didSet {
        userGroupPhotoImageView.clipsToBounds = true;
        userGroupPhotoImageView.layer.masksToBounds = true;
        userGroupPhotoImageView.layer.cornerRadius = 5.0;
    }
}

override func prepareForReuse() {
    super.prepareForReuse()
    userGroupPhotoImageView.image = nil
}

func updateWithImage(image: UIImage) {

    self.userGroupPhotoImageView.image = image
    self.setNeedsLayout()
    self.layoutIfNeeded()
}
}

答案 1 :(得分:0)

如果您没有找到任何答案。 你应该以编程方式进行。并在

中设置约束
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{

方法。 通过这种方式,您可以确定会发生什么。