objective-c - NSCollectionView 在更改 minItemSize 后丢失滚动条,直到 View 调整大小

标签 objective-c swift macos nsscrollview nscollectionview

我有一个带有垂直 NSCollectionViewFlowLayoutNSCollectionView。我在其中显示矩形图标。

我在 UI 中还有一个 slider ,当 slider 发生变化时,我会调整 minItemSize,然后在 collectionView:itemForRepresentedObjectAtIndexPath: 中使用它来创建一个同等大小的NSImageView 到返回的 NSCollectionViewItemimageView。然后我通过调用 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(), ^{ ... });

的 block 代码中调用它

在修复之前,我确实从 setSliderValue: 处理程序调用了 reloadData,该处理程序绑定(bind)到 slider 的值。看起来这并没有很好地结合起来。

关于objective-c - NSCollectionView 在更改 minItemSize 后丢失滚动条,直到 View 调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57374020/

相关文章:

swift - 在 Swift 中获取错误 Ambiguous reference to member 'subscript'

macos - Swift iTunes ScriptingBridge 链接器错误

c++ - CMake 可以在 Mac OS X 上指定基础 SDK 吗?

objective-c - XCode 中的文件命名约定

iphone - 将散列转换为 NSString?

objective-c - 将 const char* 转换为 NSString * 并转换回来 - _NSAutoreleaseNoPool()

ios - Swift:为什么点击手势识别器不是每次都能工作?

具有动态高度的 iOS 单元格宽度不佳

macos - 在 Swift 中运行 shell 命令

ios - AFMultipartFormData 上传完成后运行方法