在iOS开发中,我们经常会用到UITableView和UICollectionView两种控件进行开发,在MacOS中也有相对应的NSTableView和NSCollectionView,今天在这里记录下NSCollectionView的使用。
创建NSCollectionView
xib拖拽
创建项目工程打开Main.storyboard或Main.xib
然后编写以下代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| - (void)viewDidLoad { [super viewDidLoad]; self.collectionView.dataSource = self; [self.collectionView registerClass:[CollectionViewItem class] forItemWithIdentifier:@"item"]; }
- (NSInteger)collectionView:(NSCollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return 30; }
- (NSCollectionViewItem *)collectionView:(NSCollectionView *)collectionView itemForRepresentedObjectAtIndexPath:(NSIndexPath *)indexPath { CollectionViewItem *item = [collectionView makeItemWithIdentifier:@"item" forIndexPath:indexPath]; item.textLabel.stringValue = [NSString stringWithFormat:@"第%zi个", indexPath.item]; return item; }
|
运行程序查看
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| // 替换viewDidLoad - (void)viewDidLoad { [super viewDidLoad]; NSCollectionView *collectionView = [[NSCollectionView alloc] initWithFrame:self.view.bounds]; NSCollectionViewFlowLayout *layout = [[NSCollectionViewFlowLayout alloc] init]; layout.minimumLineSpacing = 0; layout.minimumInteritemSpacing = 0; layout.itemSize = CGSizeMake(60, 60); collectionView.collectionViewLayout = layout; collectionView.dataSource = self; [collectionView registerClass:[CollectionViewItem class] forItemWithIdentifier:@"item"]; NSClipView *clip = [[NSClipView alloc] initWithFrame:self.view.bounds]; clip.documentView = collectionView; NSScrollView *scrollView = [[NSScrollView alloc] initWithFrame:self.view.bounds]; scrollView.contentView = clip; [self.view addSubview:scrollView]; }
|
NSCollectionView与UICollectionView的区别
相同点:
- 都是使用collectionViewLayout对cell的布局
- 基本属性大都相同,偶尔会有些属性名不一致的问题
不同点:
- NSCollectionView继承NSView,使用时需要与NSScrollView和NSClipVIew进行组合使用
- NSCollectionView缺少一些组合方法,如果未找到与UICollectionView相同的方法,可以尝试单独给参数赋值来实现。
- NSCollectionViewItem继承NSViewController
NSCollectionView使用时的一些坑
- 创建自定义item时需要勾选
xib
选项,然后在注册item进复用池时,如果按UICollectionView使用时应该使用nib
的方式注册item,运行时程序崩了,你会发现从复用池中获取的item是nil。
- 在代理方法中未能找到相关选中的方法,只有一个
- (void)collectionView:(NSCollectionView *)collectionView didSelectItemsAtIndexPaths:(NSSet<NSIndexPath *> *)indexPaths
很像的方法,实现之后,发现点击item并不调用此方法。我想到的实现方式是在item中监听鼠标点击事件。