我在用Swift编写的macOS消息客户端上工作。我使用NSScrollView和NSCollectionView作为documentView来呈现消息。目前,我已经实现了无限滚动,但是现在的问题是collectionView从顶部开始加载单元格,然后向下加载-这是NSCollectionView的默认行为。取而代之的是,我需要它从底部开始并逐步提高-一种典型的消息传递应用程序显示消息的方式。

我尝试过的解决方案:


视图加载或用户选择其他对话后,立即滚动到collectionView的底部。该解决方案显然是混乱的,并且确实弄乱了无限滚动。
覆盖scrollView,scrollView的contentView和collectionView中的isFlipped变量。这样做对所有视图的可见影响为零。
按pi弧度旋转整个scrollView,collectionView,contentView或collectionView单元。作为一种绝望的措施,我试图旋转整个scrollView,但既不能这样做,也不能旋转任何collectionView项。我做了一些wantsLayer = truelayer!.setAffineTransform(CGAffineTransform(rotationAngle: .pi))updateLayer()setNeedsDisplay(frameRect)的事情。这又没有可见的影响。


使NSCollectionView从底部移到顶部的最佳方法是什么?顺便说一句,我不使用情节提要。

最佳答案

您好@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")
}

关于swift - Swift NSCollectionView流程从下到上,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54431199/

10-11 15:13