Mac应用开发NSCollectionView 纯代码用法遇到的坑

  • 想开发一个VideoLine 加载视频关键帧的缩略图 于是想纯代码自定义一个VideoLineView (NSView), 里面加一个NSCollectionView ,但是开发的过程中就碰到无法回调代理方法func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem,但是func collectionView(_ collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int 也可以回调成功,一直折腾了好久才发现问题的真正原因。
  • 一般开发的时候都是在XIB或者Storyboard上托一个CollctionView 空间,Mac应用在XIB上拉入的控件CollctionView,外面嵌套了好几层东西,比iOS上层级关系复杂很多,如下图所示,拉入的CollectionView 外面包裹了好几层,最外层就是个ScrollView. Mac应用开发NSCollectionView 纯代码用法遇到的坑_第1张图片
  • 自定义一个View 初始化后,添加到ViewController 的View上后
class VideoLineView: NSView {
    var imagesCollectionView: NSCollectionView!
   // var scrollView: NSScrollView! 后面添加的

 override init(frame frameRect: NSRect) {
        super.init(frame: frameRect)
        imagesCollectionView = NSCollectionView.init(frame: NSRect.init(x: 0, y: 0, width: frame.size.width, height: frame.size.height))
        let flowLayOut = NSCollectionViewFlowLayout.init()
        flowLayOut.itemSize = thumbnailSize
        flowLayOut.minimumInteritemSpacing = 0
        imagesCollectionView.collectionViewLayout = flowLayOut
        imagesCollectionView.register(NSNib.init(nibNamed: NSNib.Name(rawValue: "FPTimeLineCollectionItem"), bundle: nil), forItemWithIdentifier: NSUserInterfaceItemIdentifier(rawValue: "FPTimeLineCollectionItem"))
        self.addSubview(imagesCollectionView)
        imagesCollectionView.dataSource = self
        imagesCollectionView.delegate = self
    }
}
extension VideoLineView: NSCollectionViewDataSource,NSCollectionViewDelegate{
   ///代理方法
}

发现无法正确回调NSCollectionViewDataSource
对比发现CollectionView外面少了一层ScrollView

  • 于是,纯代码在外面添加一个ScrollView,奇迹发生了,一切正常了
 override init(frame frameRect: NSRect) {
        super.init(frame: frameRect)
        scrollView = NSScrollView.init(frame: NSRect.init(x: 0, y: 0, width: frame.size.width, height: frame.size.height))
        self.addSubview(scrollView)
        imagesCollectionView = NSCollectionView.init(frame: NSRect.init(x: 0, y: 0, width: frame.size.width, height: frame.size.height))
        let flowLayOut = NSCollectionViewFlowLayout.init()
        flowLayOut.itemSize = thumbnailSize
        flowLayOut.minimumLineSpacing = 0
        flowLayOut.minimumInteritemSpacing = 0
        flowLayOut.scrollDirection = .horizontal
        imagesCollectionView.collectionViewLayout = flowLayOut
        imagesCollectionView.register(NSNib.init(nibNamed: "FPTimeLineCollectionItem", bundle: nil), forItemWithIdentifier: "FPTimeLineCollectionItem")
        self.scrollView.contentView.addSubview(imagesCollectionView)
        imagesCollectionView.dataSource = self
        imagesCollectionView.delegate = self
    }

Mac开发相对于iOS开发,还是麻烦很多,很多API没有iOS那么直接,不过心得Api 貌似逐渐向iOS在靠拢,特别是NSCollectionViewLayOut 新的API 和iOS 基本一致;Mac开发的过程纯代码自定义控件的时候一定要了解清楚控件用哪些部分组层的,不然,开发的过程中总是会遇到一些奇怪的问题。

你可能感兴趣的:(Mac应用开发)