swift - 重新加载数据后 NSCollectionViewItem 困惑

标签 swift cocoa nscollectionview nscollectionviewitem

我正在使用 NSCollectionView 和 NSCollectionViewItems。

我遇到了以下问题: 如果我旋转其中一项的 NSImageView,然后调用 reloadData, 更新后的 View 会变得困惑。旋转会跳到下一个项目,角度会不同等等。

下面的图像和代码:

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
}

}

委托(delegate)方法:

     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
}

最佳答案

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

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

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

此外,请勿在旋转代码之后调用 collectionViewItem.reloadData()

关于swift - 重新加载数据后 NSCollectionViewItem 困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42345912/

相关文章:

ios - 在没有底层 flash 的情况下,如何在 View 出现之前执行 Segue?

objective-c - 从大纲 View 中删除行

objective-c - NSCollectionView 中的居中项目

iphone - 我拥有的 NSManagedObject 被 main.m 释放了吗?

swift - 翻转 NSButton 的图像倒置

xcode - 如何从头开始以编程方式创建 NSCollectionView?

ios - 如果 CollectionView 项目集成了另一个 CollectionView,则无法选择该项目

swift - 在初始化所有存储的属性之前,在方法调用 'self' 中使用 'f'

ios - 动画 View 并中途停止

swift - 简而言之,使用 SwiftyJSON 将 Map 对象写入 Array