8

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

我创建了一个小型示例应用程序,它也演示了该问题。这是一个基本的 macOS 应用程序,它通过主故事板添加 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;  
}

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

在此处输入图像描述

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

4

6 回答 6

16

我在运行 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];
  }
于 2017-11-08T12:26:00.197 回答
1

我在 macOS 10.14 上遇到了类似的问题。我接到一个电话来设置选择-viewDidLoad

[self.collectionView selectItemsAtIndexPaths:[NSSet setWithCollectionViewIndexPath: indexPath] scrollPosition:NSCollectionViewScrollPositionNone];

这导致了破坏的布局。我能够通过将此调用移至-viewWillAppear.

于 2019-10-24T08:21:45.040 回答
1

我的解决方案是,如果我能正常显示collectionView,我将viewController嵌入到一个窗口中。如果我想要一个弹出框,我将以下内容用于我的 ViewController:

    override func viewDidAppear() {
self.view.setFrameSize(NSSize(width: self.view.frame.size.width, height: self.view.frame.size.height + 1))

}

您必须更改一个(或两个)值,无论哪个值都没有关系。

于 2020-07-18T19:37:52.847 回答
0

在我的 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)
    }
}
于 2019-04-13T14:17:06.293 回答
0

如果您NSCollectionView以编程方式创建,请确保它是documentViewNSScrollView,否则它不会滚动。

let collectionView = NSCollectionView(frame: .zero)
let scrollView = NSScrollView()
scrollView.documentView = collectionView
于 2021-11-02T19:14:28.903 回答
0
 section.orthogonalScrollingBehavior = .continuous

在您的 NSCollectionViewLayout 中,这只能应用于部分而不是组。

于 2021-12-02T22:12:20.353 回答