Прокрутка NSCollectionView, когда размер элемента больше, чем при просмотре с рамкой - PullRequest
0 голосов
/ 27 февраля 2019

У меня следующая проблема.

Представьте, что у нас есть 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?

Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...