Быстрый поток NSCollectionView снизу вверх - PullRequest
0 голосов
/ 30 января 2019

Я работаю над клиентом обмена сообщениями для 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 Ответ

0 голосов
/ 30 января 2019

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