NSCollectionViewItem在reloadData之后搞砸了

时间:2017-02-20 13:32:15

标签: swift cocoa nscollectionview nscollectionviewitem

我正在使用NSCollectionView和NSCollectionViewItems。

我遇到了以下问题: 如果我旋转其中一个项目的NSImageView,然后调用reloadData, 更新后的视图会搞砸。旋转将跳转到下一个项目,角度将不同等等。

下面的图片和代码:

enter image description here

enter image description here

enter image description here

enter image description here

轮换码:

let collectionViewItem = collectionView.item(at: ip) as? LibraryViewItem
collectionViewItem?.imageView?.rotate(byDegrees: CGFloat(degree))
collectionViewItem?.model?.Rotation! += degree
collectionViewItem.reloadData()

型号:

 class LibraryViewItem: NSCollectionViewItem {

// 1
var model: ImageModel? {
    didSet {
        guard isViewLoaded else {
            print("asd")
            return }
        if let imageFile = model {
            imageView?.image = imageFile.thumbnail
            textField?.stringValue = imageFile.fileName
        } else {
            imageView?.image = nil
            textField?.stringValue = ""
        }
    }
}

// 2
override func viewDidLoad() {
    super.viewDidLoad()
    view.wantsLayer = true
    view.layer?.backgroundColor = NSColor.white.cgColor
    // 1
    view.layer?.borderWidth = 0.0
    // 2
    view.layer?.borderColor = NSColor.lightGray.cgColor


}

func setHighlight(_ selected: Bool) {
    view.layer?.borderWidth = selected ? 5.0 : 0.0
}

}

代表metod:

     func collectionView(_ collectionView: NSCollectionView,   itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem {

    let item = collectionView.makeItem(withIdentifier: "LibraryViewItem", for: indexPath)
    guard let collectionViewItem = item as? LibraryViewItem else {return item}

    let libraryModel = itemsToShow[indexPath.item]
    collectionViewItem.model = libraryModel
    if let selectedIndexPath = collectionView.selectionIndexPaths.first, selectedIndexPath == indexPath {
        collectionViewItem.setHighlight(true)
    } else {
        collectionViewItem.setHighlight(false)
    }

    return item
}

1 个答案:

答案 0 :(得分:2)

通过避免项目实例化来重用NSCollectioViewItem以提高性能。

NSCollectioViewItem有一个名为prepareForReuse()的方法,在重新使用该项目之前会调用该方法。

要解决您的问题,请覆盖prepareForReuse()并在您的自定义实施中(重新)将图像旋转设置为零度。

此外,请勿在轮换代码后调用collectionViewItem.reloadData()