简介
相比于UICollectionView
,NSCollectionView
可以实现的功能都一样,主要是使用方式上注意点很多,这里推荐使用xib来自定义NSCollectionView
和NSCollectionViewItem
,因为我们知道在mac开发中,滑动视图需要添加NSClipView
和NSScrollerView
上,并添加NSScroller
才能正常使用,加大了开发难度,xib拖拽会帮我们做好这些工作。
值得注意的是大部分实用的接口在MacOS10.11后才可用,版本适配需要注意
delegate
NSCollectionViewDelegate
负责视图的动作代理,例如拖拽,点击操作
我们一般只需要实现点击回调
//点击事件
- (void)collectionView:(NSCollectionView *)collectionView didSelectItemsAtIndexPaths:(NSSet<NSIndexPath *> *)indexPaths
dataSource
NSCollectionViewDataSource
是NSCollectionView中重要的部分,决定视图是否显示的关键。
一般需要实现的代理如下:
//返回section中item数量
- (NSInteger)collectionView:(NSCollectionView *)collectionView numberOfItemsInSection:(NSInteger)section NS_AVAILABLE_MAC(10_11);
//返回item的view视图,类型为NSCollectionViewItem
- (NSCollectionViewItem *)collectionView:(NSCollectionView *)collectionView itemForRepresentedObjectAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_MAC(10_11);
//section的数量,不实现此代理则默认为1
- (NSInteger)numberOfSectionsInCollectionView:(NSCollectionView *)collectionView NS_AVAILABLE_MAC(10_11);
// 返回section的视图,类型为NSView
- (NSView *)collectionView:(NSCollectionView *)collectionView viewForSupplementaryElementOfKind:(NSCollectionViewSupplementaryElementKind)kind atIndexPath:(NSIndexPath *)indexPath;
collectionViewLayout
collectionViewLayout
布局layout对象,当使用xib布局时,xib会默认给我们设置,我们也同时可以在xib中设置相关的值。
同样也可以代码设置,然后赋值给collectionViewLayout
NSCollectionViewDelegateFlowLayout
流式布局时我们可以通过代理方法实时改变item
,header
,footer
的大小,和相关的行间距,item间距以及EdgeInsets
//实时改变item大小
- (NSSize)collectionView:(NSCollectionView *)collectionView layout:(NSCollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath;
- (NSEdgeInsets)collectionView:(NSCollectionView *)collectionView layout:(NSCollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section;
- (CGFloat)collectionView:(NSCollectionView *)collectionView layout:(NSColle