У меня следующая проблема.
Представьте, что у нас есть NSCollectionView
, который отображает элементы.Теперь я хочу добиться следующего поведения.Если размер элемента больше, чем размер borderedScrollView
, в который встроен NSCollectionView
, я хочу прокрутить элемент.
Вы можете думать об этом как о странице, которая была увеличена. Если размер увеличенной страницы больше размера прямоугольника, я хочу иметь возможность прокручивать всю страницу по горизонтали, пока я не достигну ее границы.,Вертикальная прокрутка работает просто отлично.
В качестве примера я создал простой проект XCode.
В основном storyboard
(ViewSize 490x590) я добавил NSCollectionView
, размер которого borderedViewScroll равен480x580 с ограничениями автопоставки.
Также я добавил дополнительный вид collectionViewItem.xib
, на котором перетянул collectionViewItem
(размер 480x580), NSImageView
(размер 480x580).Я сделал ассоциацию внутри collectionViewItem
в этом дополнительном представлении.Вид -> дополнительный вид.imageView -> imageView, который я перетащил на вид.
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
#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
В результате отображаются 10 красных прямоугольников, размер которого больше, чем размер borderedScrollView
.Однако у меня нет горизонтальной прокрутки, которую я хочу иметь.
Что мне делать?Реализация пользовательского макета путем наследования от NSCollectionViewLayout
?
Заранее спасибо.