macOS NSCollectionView简单操作
先看效果
最简单的两份文件,复制-生产即可运行
第一份(主要)
ViewController.h
#import <Cocoa/Cocoa.h> @interface ViewController : NSViewController @end
ViewController.m
@interface ViewController ()<NSCollectionViewDelegate,NSCollectionViewDataSource> //具体层级关系是NSScrollView——NSClipView——NSCollectionView。 /** 滚动显示 */ @property (nonatomic, strong) NSScrollView *scrollView; //NSCollectionView显示 @property (nonatomic, strong) NSCollectionView *collectionView; //数据项( @property (nonatomic, strong) NSMutableArray *dataSource; @end @implementation ViewController #pragma mark 懒加载 macos - (NSMutableArray *)dataSource { if (!_dataSource) { _dataSource = [NSMutableArray arrayWithArray:@[@"张三", @"李四", @"王五"]]; } return _dataSource; } - (NSCollectionView*)collectionView{ if(!_collectionView){ _collectionView = [[NSCollectionView alloc] init]; [self.scrollView setDocumentView:self.collectionView]; _collectionView.dataSource = self; _collectionView.delegate = self; _collectionView.selectable = YES; _collectionView.backgroundColors = @[[NSColor colorWithCalibratedRed:5.0 green:0.0 blue:255.0 alpha:1.0]]; [_collectionView registerClass:FSitem.class forItemWithIdentifier:@"FSitem"]; } return _collectionView; } - (NSScrollView*)scrollView{ if(!_scrollView){ _scrollView = [[NSScrollView alloc]init]; [self.view addSubview:self.scrollView]; [_scrollView setBorderType:NSNoBorder]; [_scrollView setHasVerticalScroller:NO];//垂直 [_scrollView setHasHorizontalScroller:YES];//水平 [_scrollView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; } return _scrollView; } //自适应 - (void)configureCollectionViewLayout{ NSCollectionViewFlowLayout *flowLayout = [[NSCollectionViewFlowLayout alloc] init]; flowLayout.minimumLineSpacing = 0; flowLayout.minimumInteritemSpacing = 0; flowLayout.itemSize = NSMakeSize(30, 30); flowLayout.scrollDirection = NSCollectionViewScrollDirectionHorizontal; [self.collectionView setCollectionViewLayout:flowLayout]; } - (void)viewDidLoad { [super viewDidLoad]; // Do view setup here. [self configureCollectionViewLayout]; /** 用户确认书滚动条 */ CGFloat tSVY = 200; CGFloat tSVW = 50; CGFloat tSVH = 20; CGFloat tSVX = 20; self.scrollView.frame = CGRectMake(tSVX, tSVY, tSVW, tSVH); CGFloat tVY = 20; CGFloat tVW = 200; CGFloat tVH = 200; CGFloat tVX = 20; self.collectionView.frame = CGRectMake(tVX, tVY, tVW, tVH); [[self.scrollView contentView] setPostsBoundsChangedNotifications: YES];//发起通知 //找个合适的地儿,注册通知 NSNotificationCenter *center = [NSNotificationCenter defaultCenter] ; [center addObserver: self selector: @selector(boundsDidChangeNotification:) name: NSViewBoundsDidChangeNotification object: [self.scrollView contentView]]; } - (void) boundsDidChangeNotification: (NSNotification *) notification{ // 在这里进行处理 NSClipView *changedContentView = [notification object]; // get the origin of the NSClipView of the scroll view that // we're watching NSPoint changedBoundsOrigin = [changedContentView documentVisibleRect].origin; //判断滚动条移动高度变化确认是否移动拉动滚动到底 NSLog(@"滑动了:%f",changedBoundsOrigin.y); if (changedBoundsOrigin.y > 560) { // self.argeeButton.enabled = YES; }else{ // self.argeeButton.enabled = NO; } } //竖(列) -(NSInteger)numberOfSectionsInCollectionView:(NSCollectionView *)collectionView{ return self.dataSource.count; } //横(行) -(NSInteger)collectionView:(NSCollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{ return 1; } //显示出来 -(NSCollectionViewItem *)collectionView:(NSCollectionView *)collectionView itemForRepresentedObjectAtIndexPath:(NSIndexPath *)indexPath{ FSitem *item = [collectionView makeItemWithIdentifier:@"FSitem" forIndexPath:indexPath]; if (!item) { item = [[FSitem alloc] initWithNibName:@"FSitem" bundle:nil]; } // item.name.stringValue = self.dataSource[indexPaths]; return item; } //选中item调用的方法 -(void)collectionView:(NSCollectionView *)collectionView didSelectItemsAtIndexPaths:(NSSet<NSIndexPath *> *)indexPaths{ NSLog(@"选中了%@",indexPaths); } //实时改变item大小 - (NSSize)collectionView:(NSCollectionView *)collectionView layout:(NSCollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{ // if (indexPath.item == 0) { // NSSize rect = NSMakeSize(collectionView.bounds.size.width - 15, 50); // NSLog(@"sizeForItemAtIndexPath 2 %@",NSStringFromSize(rect)); // return rect; // } // return CGSizeMake(100, 60);//宽,高
} - (NSEdgeInsets)collectionView:(NSCollectionView *)collectionView layout:(NSCollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section;{ return NSEdgeInsetsMake(20, 30, 100, 200);//顶,左,下,右
}
FSitem.h(带xib 继承NSCollectionViewItem)
#import <Cocoa/Cocoa.h> @interface FSitem : NSCollectionViewItem @property (weak) IBOutlet NSTextField *name; @end
FSitem.m
#import "FSitem.h" @interface FSitem () @end @implementation FSitem - (void)viewDidLoad { [super viewDidLoad]; // Do view setup here. self.view.wantsLayer = YES; self.view.layer.backgroundColor = [NSColor systemBlueColor].CGColor; } @end
FSitem.xib