我有一个带有垂直 NSCollectionViewFlowLayout
的 NSCollectionView
。我在其中显示矩形图标。
我在 UI 中还有一个 slider ,当 slider 发生变化时,我会调整 minItemSize
,然后在 collectionView:itemForRepresentedObjectAtIndexPath:
中使用它来创建一个同等大小的NSImageView
到返回的 NSCollectionViewItem
的 imageView
。然后我通过调用 reloadData
重新加载 View 。
之后, View 将按预期显示新尺寸的图标。
问题是,如果我要显示的数据多于当前 ScrollView 的数据,那么当常规系统偏好设置设置为显示滚动条:滚动时时,滚动条在重新加载后消失 Collection View ,并尝试使用触控板滚动会导致反弹,这告诉我 ScrollView 认为内容只是可见的内容,无需滚动。
但是一旦我调整窗口大小(这也调整了内部 Collection View 的大小),滚动条就会回来。
奇怪的是,如果系统首选项设置为显示滚动条:始终,则不会出现问题,并且滚动始终有效,并且滚动条始终保持可见。
我尝试了很多方法来触发 ScrollView 的重新计算,例如使 Collection View 的布局、 ScrollView 本身、其内容 View 的布局无效,并且还尝试将它们的needsLayout设置为真的。没有什么能让这个工作成功。
更新:潜在的重复 ( NSCollectionView does not scroll items past initial visible rect ),既不是 collectionView.setFrameSize:
也不是 window.setFrame:
建议适用于我的情况(我尝试在 reloadData
之前和之后添加这些行)。
即使我像这样强制调整窗口大小,它也不会恢复滚动条,只有手动拖动窗口边缘才会恢复:
[self.collectionView.window setFrame:NSInsetRect(self.view.window.frame, 1, 1) display:YES];
另请注意,就我而言,最初滚动有效,只是在调整大小和重新加载后不起作用。
另一个发现:当我在 reloadData 之后调用 selectItemsAtIndexPaths:scrollPosition:
时,滚动条会回来。但前提是我为路径传递非空 NSSet
。由于我可能没有选择任何项目,因此这不是永久解决方案。
如果没有其他想法出现,我会尝试制作一个演示项目。
最佳答案
我已经解决了:
我不得不延迟对 reloadData
的调用,例如通过从 dispatch_async(dispatch_get_main_queue(), ^{ ... });
在修复之前,我确实从 setSliderValue:
处理程序调用了 reloadData
,该处理程序绑定(bind)到 slider 的值。看起来这并没有很好地结合起来。
关于objective-c - NSCollectionView 在更改 minItemSize 后丢失滚动条,直到 View 调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57374020/