当项目大小大于边框滚动视图时,NSCollectionView滚动

时间:2019-02-26 23:43:16

标签: objective-c cocoa

我有以下问题。

想象一下我们有NSCollectionView,它显示项目。现在,我要实现的行为如下。如果项目大小较大,则嵌入borderedScrollView的{​​{1}}的大小,我希望能够在该项目上滚动。

您可以将其视为已放大的页面。如果缩放后​​的页面的尺寸大于矩形的尺寸,我希望能够水平滚动整个页面直到到达其边界。垂直滚动条工作正常。

作为示例,我创建了一个简单的XCode项目。

在主要的NSCollectionView(ViewSize 490x590)中,我添加了storyboard,其{borderedViewScroll的大小为480x580,并且具有自动布局约束。

我还添加了辅助视图NSCollectionView,在其上拖动了collectionViewItem.xib(尺寸480x580),collectionViewItem(尺寸480x580)。在此补充视图中,我在NSImageView内部建立了关联。视图->补充视图。 imageView->我在视图上拖动的imageView。

collectionViewItem

ViewController.h

#import <Cocoa/Cocoa.h> @interface ViewController : NSViewController <NSCollectionViewDataSource> @property (weak) IBOutlet NSCollectionView *collectionView; - (NSInteger)numberOfSectionsInCollectionView:(NSCollectionView *)collectionView; - (NSInteger)collectionView:(NSCollectionView *)collectionView numberOfItemsInSection:(NSInteger)section; - (NSCollectionViewItem *)collectionView:(NSCollectionView *)collectionView itemForRepresentedObjectAtIndexPath:(NSIndexPath *)indexPath; @end

ViewController.m

结果,显示了10个红色矩形,其大小大于#import "ViewController.h" @implementation ViewController @synthesize collectionView; static NSInteger width = 580, height = 680; - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. NSNib *nib = [[NSNib alloc] initWithNibNamed:@"collectionViewItem" bundle:nil]; [collectionView registerNib:nib forItemWithIdentifier:@"collectionViewItem"]; [collectionView setDataSource:self]; NSCollectionViewGridLayout *layout = [NSCollectionViewGridLayout new]; [layout setMaximumNumberOfColumns:1]; [layout setMinimumItemSize:NSMakeSize(480, 580)]; [layout setMinimumInteritemSpacing:20.]; [layout setMinimumLineSpacing:20.]; [collectionView setCollectionViewLayout:layout]; } - (void)setRepresentedObject:(id)representedObject { [super setRepresentedObject:representedObject]; // Update the view, if already loaded. } - (NSInteger)numberOfSectionsInCollectionView:(NSCollectionView *)collectionView { return 1; } - (nonnull NSCollectionViewItem *)collectionView:(nonnull NSCollectionView *)collectionView itemForRepresentedObjectAtIndexPath:(nonnull NSIndexPath *)indexPath { NSCollectionViewItem* item = [self.collectionView makeItemWithIdentifier:@"collectionViewItem" forIndexPath:indexPath]; CGRect myBoundingBox = CGRectMake (0, 0, width, height); CGContextRef myBitmapContext = NULL; CGColorSpaceRef colorSpace; void *bitmapData = NULL; colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); myBitmapContext = CGBitmapContextCreate (bitmapData, width, height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast); CGColorSpaceRelease(colorSpace); CGContextSetRGBFillColor (myBitmapContext, 1, 0, 0, 1); CGContextFillRect (myBitmapContext, CGRectMake (0, 0, width, height)); CGImageRef myImage = CGBitmapContextCreateImage (myBitmapContext); CGContextDrawImage(myBitmapContext, myBoundingBox, myImage); CGContextRelease (myBitmapContext); NSImage *theImage = [[NSImage alloc] initWithCGImage: myImage size: NSMakeSize(width, height)]; CGImageRelease(myImage); free(bitmapData); item.imageView.image = theImage; item.imageView.frame = NSMakeRect(0., 0., width, height); return item; } - (NSInteger)collectionView:(nonnull NSCollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return 10; } @end 的大小。但是,我没有想要的水平滚动。

我该怎么办?通过继承borderedScrollView来实现自定义布局?

谢谢。

0 个答案:

没有答案