【问题标题】:how to fix NSCollectionViewItem overlap problem?如何解决 NSCollectionViewItem 重叠问题?
【发布时间】:2021-05-24 18:06:23
【问题描述】:

我使用 NSCollectionView 来显示一个水平列表。但是所有单元格都在第一个单元格位置重叠,就像这样。

我没有足够的声誉来发布图片。 [cell1,cell2,cell3],它们都在第一个单元格位置重叠。所以它看起来只是一个单元格,但实际上它有 3 个单元格。

我的主要代码:

ViewController.h

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.flowLayout.scrollDirection = NSCollectionViewScrollDirectionHorizontal;
    self.collectionView.dataSource = self;
    self.collectionView.delegate = self;
    self.collectionView.selectable = YES;
    self.collectionView.allowsMultipleSelection = YES;
    [self.collectionView registerNib:[[NSNib alloc] initWithNibNamed:@"ScreenShotCellView" bundle:nil] forItemWithIdentifier:NSStringFromClass([ScreenShotCellView class])];
}

#pragma mark - NSCollectionViewDataSource
- (NSInteger)numberOfSectionsInCollectionView:(NSCollectionView *)collectionView {
    [self.collectionView.collectionViewLayout invalidateLayout];
    return 1;
}

- (NSInteger)collectionView:(NSCollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return self.screenshotItems.count;
}

- (NSCollectionViewItem *)collectionView:(NSCollectionView *)collectionView itemForRepresentedObjectAtIndexPath:(NSIndexPath *)indexPath {
    NSCollectionViewItem *itemCell = [self.collectionView makeItemWithIdentifier:NSStringFromClass([ScreenShotCellView class]) forIndexPath:indexPath];
    if ([itemCell isKindOfClass:[ScreenShotCellView class]]) {
        ScreenShotCellView *cellView = (ScreenShotCellView *)itemCell;
        ScreenshotItem *itemData = [self.screenshotItems objectAtIndex:indexPath.item];
        cellView.item = itemData;
    }
    return itemCell;
}

#pragma mark - NSCollectionViewDelegateFlowLayout
- (NSSize)collectionView:(NSCollectionView *)collectionView layout:(NSCollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    return CGSizeMake(100, self.collectionView.frame.size.height - 20);
}

- (CGFloat)collectionView:(NSCollectionView *)collectionView layout:(NSCollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section {
    return 10;
}

- (CGFloat)collectionView:(NSCollectionView *)collectionView layout:(NSCollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section {
    return 10;
}

我该如何解决?

【问题讨论】:

标签: macos cocoa osx-lion nscollectionview nscollectionviewitem


【解决方案1】:

我找到了原因。 问题出在我的自定义单元格中。

@interface ScreenShotCellView ()

@property (weak) IBOutlet NSView *containerView;

@end

@implementation ScreenShotCellView

- (void)loadView {
    self.view = self.containerView;
}

@end

loadView 方法中。 self.view = self.containerView; 使始终显示在第一个单元格中。

这样改后就正常了。

- (void)loadView {
    self.view = [[NSView alloc] init];
    [self.view addSubview:self.containerView];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 2021-12-04
    • 2023-01-07
    相关资源
    最近更新 更多