我有以下问题。
想象一下我们有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
来实现自定义布局?
谢谢。