Быстрый поток 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")
}