Cocoa开发中NSCollectionView点击前进后退按钮无法滚动如何解决?
NSCollectionView点击左右按钮无法滚动解决方案
问题原因
- 未给
NSCollectionViewFlowLayout设置横向滚动属性,布局默认是纵向滚动,横向没有滚动空间 - 直接调用
collectionView.scrollToVisible的方式不符合AppKit的滚动层级逻辑,滚动操作应该作用在外层的NSScrollView上,或者使用集合视图自带的Item滚动方法
修复步骤
- 先修改
configureCollectionView方法,给布局添加横向滚动配置:
private func configureCollectionView() { let flowLayout = NSCollectionViewFlowLayout() // 新增这一行 设置横向滚动 flowLayout.scrollDirection = .horizontal flowLayout.itemSize = NSSize(width: 160.0, height: 160.0) flowLayout.minimumInteritemSpacing = 10.0 flowLayout.minimumLineSpacing = 10.0 collectionView.collectionViewLayout = flowLayout view.wantsLayer = true collectionView.layer?.backgroundColor = NSColor.red.cgColor }
- 替换按钮点击的实现,两种方案可选:
方案1:固定偏移量滚动
@IBAction func buttonLeft(_ sender: Any) { let currentOffset = scrollView.contentView.bounds.origin.x let newOffset = max(0, currentOffset - 100) scrollView.contentView.scroll(to: NSPoint(x: newOffset, y: 0)) scrollView.reflectScrolledClipView(scrollView.contentView) } @IBAction func buttonRight(_ sender: Any) { let currentOffset = scrollView.contentView.bounds.origin.x let maxOffset = collectionView.frame.width - scrollView.bounds.width let newOffset = min(maxOffset, currentOffset + 100) scrollView.contentView.scroll(to: NSPoint(x: newOffset, y: 0)) scrollView.reflectScrolledClipView(scrollView.contentView) }
方案2:按单个Item滚动(不会出现半元素显示的情况,体验更好)
@IBAction func buttonLeft(_ sender: Any) { guard let firstVisibleIndex = collectionView.indexPathsForVisibleItems().sorted().first, firstVisibleIndex.item > 0 else { return } let targetIndex = IndexPath(item: firstVisibleIndex.item - 1, section: 0) collectionView.scrollToItems(at: [targetIndex], scrollPosition: .leading, animated: true) } @IBAction func buttonRight(_ sender: Any) { guard let lastVisibleIndex = collectionView.indexPathsForVisibleItems().sorted().last, lastVisibleIndex.item < availableUsers.count - 1 else { return } let targetIndex = IndexPath(item: lastVisibleIndex.item + 1, section: 0) collectionView.scrollToItems(at: [targetIndex], scrollPosition: .trailing, animated: true) }
内容的提问来源于stack exchange,提问作者iosSwift
相关产品推荐
相关产品推荐

