2017-02-20 3 views
1

Im работает с NSCollectionView и NSCollectionViewItems.NSCollectionViewItem messed after reloadData

Я столкнулся с следующей проблемой: Если я повернул 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

В NSCollectioViewItem с повторно используются для повышения производительности, избегая элемента экземпляра.

NSCollectioViewItem имеет метод, называемый prepareForReuse(), который вызывается перед повторным использованием элемента.

Чтобы устранить проблему, переопределите prepareForReuse() и (повторно) установите поворот изображения в нуль градусов в своей пользовательской реализации.

Кроме того, не вызывайте collectionViewItem.reloadData() после кода поворота.

+1

Большое спасибо! Это именно то, что зафиксировало проблему! – PolosatiyVjih