NSCollectionView不会滚动项目超过初始可见的rect

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NSCollectionView不会滚动项目超过初始可见的rect相关的知识,希望对你有一定的参考价值。

在尝试修复一些出色的macOS 10.13错误时,我遇到了现有应用程序的问题。我有一个小的NSCollectionView,看起来类似于日历应用程序中的小月历。它会显示天数并在点击时垂直滚动。但是,在macOS 10.13上,集合视图仅显示几行而不会滚动。我已经验证数据源被正确调用,它确实尝试加载其他项目 - 但不会滚动到它们。

我已经创建了一个小示例应用程序,它也演示了这个问题。这是一个基本的macOS应用程序,它通过Main故事板添加NSCollectionView,并具有从nib加载的通用NSCollectionViewItem类。主视图控制器中的整个代码是:

- (void)viewDidLoad {  
  [super viewDidLoad];  

  NSNib *nib = [[NSNib alloc] initWithNibNamed:@"FooCollectionViewItem" bundle:nil];  
  [self.collectionView registerNib:nib forItemWithIdentifier:@"foo"];  
}  
- (void)viewDidAppear {  
  [super viewDidAppear];  

  [self.collectionView reloadData];  
}  
- (void)setRepresentedObject:(id)representedObject {  
  [super setRepresentedObject:representedObject];  

}  
- (NSInteger)numberOfSectionsInCollectionView:(NSCollectionView *)collectionView {  
  return 1;  
}  
- (NSInteger)collectionView:(NSCollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {  
  return 2000;  
}  
- (NSCollectionViewItem *)collectionView:(NSCollectionView *)collectionView itemForRepresentedObjectAtIndexPath:(NSIndexPath *)indexPath {  
  FooCollectionViewItem *item = [collectionView makeItemWithIdentifier:@"foo" forIndexPath:indexPath];  
  item.fooField.stringValue = [NSString stringWithFormat:@"%ld", indexPath.item];  

  return item;  
}

生成的应用程序如下所示:

enter image description here

不幸的是,这完全是集合视图。滚动不会滚动任何其他项目。我已经将示例应用程序上传到https://www.dropbox.com/sh/wp2y7g0suemzcs1/AABVKfTZq54J7riy6BR7Mhxha?dl=0,以防有用。任何想法为什么这对我来说打破10.13?

答案

我在运行High Sierra的NSCollectionView滚动时遇到了类似的问题。这是我解决它的方式:

迅速

  if #available(OSX 10.13, *) {
    if let contentSize = self.collectionView.collectionViewLayout?.collectionViewContentSize {
      self.collectionView.setFrameSize(contentSize)
    }
  }

OBJ-C

  if (@available(macOS 10.13, *)) {
    [self.collectionView setFrameSize: self.collectionView.collectionViewLayout.collectionViewContentSize];
  }
另一答案

在我的macOS Mojave 10.14.4上,使用Xcode 10.2,在我向我的应用程序添加自定义NSWindowController之前,NSCollectionView不会滚动。我从这里找到https://www.raywenderlich.com/783-nscollectionview-tutorial的Ray Wenderlich教程中借用了以下viewDidLoad。我不知道它为什么会起作用,但确实如此。

override func windowDidLoad() {
    super.windowDidLoad()
    if let window = window, let screen = NSScreen.main {
        let screenRect = screen.visibleFrame
        window.setFrame(NSRect(x: screenRect.origin.x, y: screenRect.origin.y, width: screenRect.width/2.0, height: screenRect.height), display: true)
    }
}

以上是关于NSCollectionView不会滚动项目超过初始可见的rect的主要内容,如果未能解决你的问题,请参考以下文章

在 NSCollectionView 中禁用 PDFView 的滚动

NSCollectionView 中的居中项目

NSCollectionView`validdrop`委托没有被调用

Swift 集合视图不会添加超过 6 个项目?

NSCollectionView+NSScrollView 中的鼠标悬停

QLThumbnailGenerator 加载错误的图像