Быстрый поток NSCollectionView снизу вверх

Я работаю над клиентом обмена сообщениями для MacOS, написанным на Swift. Я использую NSScrollView с NSCollectionView в качестве documentView для представления сообщений. В настоящее время я реализовал бесконечную прокрутку, но теперь проблема в том, что collectionView загружает ячейки, начиная сверху, и работает вниз - поведение по умолчанию для NSCollectionView. Вместо этого мне нужно, чтобы он начинался снизу и шел вверх - так, как обычное приложение для обмена сообщениями отображает сообщения.

Решения, которые я попробовал:

  • Прокрутка до нижней части collectionView, как только загрузится представление или пользователь выберет другой диалог. Это решение явно дергается и по-настоящему портит бесконечную прокрутку.
  • Переопределение переменной isFlipped в scrollView, contentView scrollView и collectionView. Это не имело видимого эффекта ни для одного из представлений.
  • Вращение всех ячеек scrollView, collectionView, contentView или collectionView по пи радианам. В качестве отчаянной меры я попытался повернуть весь scrollView и не смог ни это сделать, ни повернуть ни один из элементов collectionView. Я сделал что-то вроде wantsLayer = true layer!.setAffineTransform(CGAffineTransform(rotationAngle: .pi)) updateLayer() setNeedsDisplay(frameRect), Это снова не имеет видимого влияния.

Каков наилучший способ добиться перехода NSCollectionView снизу вверх? Кстати, я не использую раскадровки.

1 ответ

Привет @ я не уверен, поможет ли вам этот код, потому что я использовал его для приложения чата 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")
}
Другие вопросы по тегам