0

我正在开发一个用 Swift 编写的 macOS 消息传递客户端。我使用带有 NSCollectionView 的 NSScrollView 作为 documentView 来呈现消息。目前,我已经实现了无限滚动,但现在的问题是 collectionView 从顶部开始加载单元格并向下工作——这是 NSCollectionView 的默认行为。相反,我需要它从底部开始并向上工作——典型的消息传递应用程序显示消息的方式。

我尝试过的解决方案:

  • 加载视图或用户选择不同的对话后,立即滚动到 collectionView 的底部。这个解决方案明显很笨拙,并且真的搞砸了无限滚动。
  • 覆盖scrollView、scrollView的contentView和collectionView中的isFlipped变量。这样做对任何视图的可见影响为零。
  • 以 pi 弧度旋转整个 scrollView、collectionView、contentView 或 collectionView 单元格。作为一个绝望的措施,我试图旋转整个 scrollView 并且无法做到这一点,也无法旋转任何 collectionView 项目。我做了一些类似的事情wantsLayer = true layer!.setAffineTransform(CGAffineTransform(rotationAngle: .pi)) updateLayer() setNeedsDisplay(frameRect)。这再次没有明显的影响。

让 NSCollectionView 从下到上的最佳方法是什么?顺便说一句,我没有使用故事板。

4

1 回答 1

0

嗨@will 我不确定这段代码是否会对你有所帮助,因为我已经将它用于 iPhone 聊天应用程序并且它适用于我。就我而言,我只是将 collectionView 放在视图控制器中。

//MARK:- View Controller life cycle method
override func viewDidLoad() {
  chatCollectionView.addObserver(self, forKeyPath: "contentSize", options: .new, context: nil)
}

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
  if(keyPath == "contentSize"){
    if let newvalue = change?[.newKey] {
        let contentHeight: CGFloat = chatCollectionView.contentSize.height
        let collectionHeight = chatCollectionView.frame.size.height
        if contentHeight < collectionHeight {
            var insets: UIEdgeInsets = chatCollectionView.contentInset
            insets.top = collectionHeight - contentHeight
            chatCollectionView.contentInset = insets
        } else {
            chatCollectionView.contentInset = .zero
        }
    }
  }
}

override func viewWillDisappear(_ animated: Bool) {
  super.viewWillDisappear(animated)
  chatCollectionView.removeObserver(self, forKeyPath: "contentSize")
}
于 2019-01-30T06:14:57.123 回答