MacOS學(xué)習(xí)(七) NSCollectionView基本使用

在AppKit中的NSCollectionView與UIKit中的UICollectionView有著很多異同點。他們都能夠使用代理和數(shù)據(jù)源方法來構(gòu)建其中的每個Cell/Item笤休。但是對于要求簡單的需求帅霜,AppKit提供了不使用代理就可以實現(xiàn)的簡單方法谭梗。

我們先來看看通過代理方法實現(xiàn)的NSCollectionView荒勇,下面是一個純代碼實現(xiàn)的NSCollectionView

// CKCollectionView.swift

class CKCollectionView: NSView {    // 這里自定義了一個View用來當(dāng)做容器
    lazy var scrollView: NSScrollView = NSScrollView.init(frame: bounds)
    lazy var collectionView: NSCollectionView = {   // 這里就是我們的NSCollectionView
      // 這里和UICollectionView中的設(shè)計一樣要糊,我們需要設(shè)定布局                                                                                               
        let flowLayout = NSCollectionViewFlowLayout.init()
        flowLayout.scrollDirection = .vertical  // 設(shè)置排列方式
        let collection = NSCollectionView.init()
        collection.collectionViewLayout = flowLayout    // 指定布局
        collection.isSelectable = true                  // item是否可以點擊
        collection.register(CKCollectionViewItem.self, forItemWithIdentifier: CKCollectionViewItem.identifier)  // 注冊Item 和NSCollectionView類似
        return collection
    }()
    override init(frame frameRect: NSRect) {
        super.init(frame: frameRect)
        
        setupSubviews()
    }
    
    required init?(coder decoder: NSCoder) {
        super.init(coder: decoder)
        
        setupSubviews()
    }
    
    func setupSubviews() -> Void {
      // 設(shè)置代理
        collectionView.delegate = self
        collectionView.dataSource = self
    /**
      這里需要注意N取D朊恕!
        scrollView是必要的技竟,collectionView必須屬于scrollView的子控件冰肴。否則
      func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem
      這個方法不會執(zhí)行!
      而之所以NSClipView使用再包一層是為了和IB中的層級保持一致榔组,這里具體功效我暫時不是很清楚熙尉,目前強行加上
      */
        let clipView = NSClipView.init(frame: bounds)
        clipView.documentView = collectionView;
        scrollView.contentView = clipView;
        addSubview(scrollView)
    
        setupSubviewsConstraints()  // 添加約束
    }
    
    func setupSubviewsConstraints() -> Void {
        NSLayoutConstraint.activate([
            scrollView.topAnchor.constraint(equalTo: (scrollView.superview?.topAnchor)!),
            scrollView.leftAnchor.constraint(equalTo: (scrollView.superview?.leftAnchor)!),
            scrollView.rightAnchor.constraint(equalTo: (scrollView.superview?.rightAnchor)!),
            scrollView.bottomAnchor.constraint(equalTo: (scrollView.superview?.bottomAnchor)!),
            ])
        scrollView.needsLayout = true
      // 使用約束的話 下面這句話是必須有的 否則會影響window,導(dǎo)致window不能用鼠標(biāo)改變大小
        scrollView.translatesAutoresizingMaskIntoConstraints = false
    }
    
}

extension CKCollectionView: NSCollectionViewDataSource, NSCollectionViewDelegate {
  // 返回Item個數(shù)
    func collectionView(_ collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int {
        return 100
    }
    /**
    返回我們的Item搓扯。這里有一個注意點:
    NSCollectionViewItem是繼承自NSViewController检痰。而在NSViewController的初始化方法中,默認(rèn)回去尋找同名的IB锨推,和UIViewController不同的是铅歼,在沒有IB的時候,我們直接使用NSViewController.init()是不會有任何問題的换可,因為loadView方法中會為我們創(chuàng)建默認(rèn)的view椎椰。但是NSViewController則不會,如果我們不手動實現(xiàn)loadView方法自己設(shè)置view的話沾鳄,view不會被創(chuàng)建慨飘。所以如果如果遇到控制臺說nib找不到的時候,可以重點看看是不是哪個控制器的view沒有賦值译荞。
    */
  
    func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem {
        let item = collectionView.makeItem(withIdentifier: CKCollectionViewItem.identifier, for: indexPath)
        return item
    }
    // 點擊方法
    func collectionView(_ collectionView: NSCollectionView, didSelectItemsAt indexPaths: Set<IndexPath>) {
        print("items select")
    }
}
// NSCollectionView的布局方法
extension CKCollectionView: NSCollectionViewDelegateFlowLayout {
  // 返回Item的size
    func collectionView(_ collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> NSSize {
        return NSSize.init(width: 80, height: 80)   
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瓤的,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吞歼,更是在濱河造成了極大的恐慌圈膏,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件篙骡,死亡現(xiàn)場離奇詭異本辐,居然都是意外死亡桥帆,警方通過查閱死者的電腦和手機医增,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進店門慎皱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人叶骨,你說我怎么就攤上這事茫多。” “怎么了忽刽?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵天揖,是天一觀的道長。 經(jīng)常有香客問我跪帝,道長今膊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任伞剑,我火速辦了婚禮斑唬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘黎泣。我一直安慰自己恕刘,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布抒倚。 她就那樣靜靜地躺著褐着,像睡著了一般。 火紅的嫁衣襯著肌膚如雪托呕。 梳的紋絲不亂的頭發(fā)上含蓉,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天,我揣著相機與錄音项郊,去河邊找鬼馅扣。 笑死,一個胖子當(dāng)著我的面吹牛呆抑,可吹牛的內(nèi)容都是我干的岂嗓。 我是一名探鬼主播,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼鹊碍,長吁一口氣:“原來是場噩夢啊……” “哼厌殉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起侈咕,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤公罕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后耀销,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體楼眷,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了罐柳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掌腰。...
    茶點故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖张吉,靈堂內(nèi)的尸體忽然破棺而出齿梁,到底是詐尸還是另有隱情,我是刑警寧澤肮蛹,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布勺择,位于F島的核電站,受9級特大地震影響伦忠,放射性物質(zhì)發(fā)生泄漏省核。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一昆码、第九天 我趴在偏房一處隱蔽的房頂上張望气忠。 院中可真熱鬧,春花似錦未桥、人聲如沸笔刹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舌菜。三九已至,卻和暖如春亦镶,著一層夾襖步出監(jiān)牢的瞬間日月,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工缤骨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留爱咬,地道東北人。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓绊起,卻偏偏與公主長得像精拟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子虱歪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,576評論 2 349