我有一个垂直NSCollectionViewFlowLayout的NSCollectionViewFlowLayout。我在里面显示矩形图标。
我在UI中还有一个滑块,当这种情况发生变化时,我调整minItemSize,然后在collectionView:itemForRepresentedObjectAtIndexPath:中使用它为返回的NSCollectionViewItem's imageView创建大小相等的NSImageView,然后通过调用reloadData重新加载视图。
之后,视图将按预期显示新大小中的图标。
问题是,如果我要显示的数据比适合当前的scoll视图要显示的数据多,那么当通用系统首选项设置为Show滚动条时:当滚动时,滚动条在重新加载集合视图后消失,并且尝试使用触控板滚动会导致反弹,这告诉我滚动视图认为内容只是可见的,没有什么可滚动的。
但是,一旦我调整了窗口的大小(窗口内部也调整了集合视图的大小),滚动条就会返回。
奇怪的是,如果系统Prefs设置为显示滚动条:总是,那么问题就不会出现,滚动始终有效,滚动条始终是可见的。
我尝试了很多东西来触发滚动视图的重新计算,比如使集合视图的布局无效,滚动视图本身,它的内容视图,还试图将它们的needsLayout设置为true。没有什么能起作用的。
更新:潜在的复制 (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时。由于我可能没有选择任何项目,这不是一个永久的解决方案。
如果没有其他的想法,我将尝试做一个演示项目。
发布于 2019-08-06 14:40:08
我已经解决了:
我不得不延迟对reloadData的调用,例如从dispatch_async(dispatch_get_main_queue(), ^{ ... });的块代码中调用它
在修复之前,我确实从reloadData处理程序调用了setSliderValue:,该处理程序绑定到滑块的值。这件事似乎不太合拍。
https://stackoverflow.com/questions/57374020
复制相似问题