0

I have NSCollectionView with items inside. I have xib for NSCollectionViewItem, with binding to representedObject.image

My issue is following. Sometimes my items should display "Empty image", till I pick image for that, through my controls. When I pick image - I store that in representedObject's .image property, binding updates the view, all is cool.

I can rotate my imageview's inside the collection. all works cool, except the situation above, when I pick image for empty one, view is being updated, binding shows proper image, but if I try to rotate the view after that - it doesnt work properly. It is being shown only in rotation where it was added, but if I rotate to a different angle - it disappears. Rotation is being observed thorugh KVO.

This is the code what I have:

class CollectionViewItem: NSCollectionViewItem {

//Init
override init?(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)

    self.addObserver(self, forKeyPath: "modelRepresentation.Rotation", options: [.new, .old], context: nil)
}

required init?(coder: NSCoder) {
    super.init(coder: coder)
}

//Properties
@objc dynamic var modelRepresentation : Artwork?

override var highlightState: NSCollectionViewItemHighlightState {
    get {
        return super.highlightState
    }
    set(newHighlightState) {
        super.highlightState = newHighlightState

        // Relay the newHighlightState to our AAPLSlideCarrierView.
        guard let carrierView = self.view as? LibraryViewItemCarrierView else {return}
        carrierView.highlightState = newHighlightState
    }
}

override var isSelected: Bool {
    get {
        return super.isSelected
    }
    set {
        super.isSelected = newValue

        guard let carrierView = self.view as? LibraryViewItemCarrierView else {return}
        carrierView.selected = newValue
    }
}


override var representedObject: Any? {
    get {
        return super.representedObject as AnyObject?
    }
    set(newRepresentedObject) {
        super.representedObject = newRepresentedObject

        if let model = newRepresentedObject as? Artwork {

            modelRepresentation = model
            imageView?.rotate(byDegrees: CGFloat((model.Rotation)))
        }
    }
}

// 2
override func viewDidLoad() {
    super.viewDidLoad()
    view.wantsLayer = true
    view.layer?.backgroundColor = NSColor(red: 15/255, green: 34/255, blue: 42/255, alpha: 1).cgColor
    view.layer?.borderWidth = 0.0
    view.layer?.borderColor = NSColor.lightGray.cgColor
}

override func prepareForReuse() {
    super.prepareForReuse()
    imageView?.boundsRotation = 0
}

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

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {

    let kind = change![NSKeyValueChangeKey.kindKey]! as! UInt

    if(keyPath == "modelRepresentation.Rotation")
    {
        if kind == NSKeyValueChange.setting.rawValue {
            guard let newVal = change![.newKey]! as? Int,
                let oldVal = change![.oldKey]! as? Int else {return}

            let delta = newVal - oldVal
            imageView?.rotate(byDegrees: CGFloat(delta))
        }
    }
}
}
PolosatiyVjih
  • 269
  • 3
  • 12

1 Answers1

0

Oops, found my bug, on CollectionView and CvItem all is ok. I was just setting an image twice in another place, and this was an issue. Thank all who viewed that topic!

PolosatiyVjih
  • 269
  • 3
  • 12