Я использую этот метод для прокрутки представления моей коллекции.
import UIKit
extension UICollectionView {
func scrollToLast() {
guard numberOfSections > 0 else {
print("number of sections < 0")
return
}
let lastSection = numberOfSections - 1
guard numberOfItems(inSection: lastSection) > 0 else {
print("number of items < 0")
return
}
let lastItemIndexPath = IndexPath(item: numberOfItems(inSection: lastSection) - 1,
section: lastSection)
self.scrollToItem(at: lastItemIndexPath, at: .centeredVertically, animated: true)
print("last Item (section, item #): \(lastItemIndexPath)")
}
}
Я не буду вызывать этот метод до тех пор, пока представление не будет загружено и в представлении коллекции есть элементы. Раньше он работал до тех пор, пока я не добавил метку к своему прототипу ячейки, и теперь, хотя представление выглядит так, как должно с новой меткой, ничто не будет прокручиваться при использовании этого метода. Я все еще могу прокрутить вид вручную. Примечание: выходные данные вышеупомянутого метода правильно перечисляют последний элемент в последнем indexPath при вызове метода.
У меня есть следующее предупреждение / ошибка в консоли, но, похоже, оно не совпадает с моментом прокруткивызывается, поэтому не уверен, что это уместно:
2019-11-04 06: 01: 13.017384-0800 AppName [17598: 4494554] [CollectionView] Попытка подготовить макет во время вызова prepareLayoutбыл уже в процессе (т. е. повторный входящий вызов) был проигнорирован. Пожалуйста, отправьте сообщение об ошибке. Экземпляр UICollectionView: (; layer =; contentOffset: {0, 0}; contentSize: {0, 0}; AdjustContentInset: {0, 0, 0, 0}; макет:; dataSource: appBundle.instance
Пример того, как я это называю: (это в viewDidLoad)
DataService.instance.messageListener(roomId: room.id, { (result) in
self.messageArr.append(result)
self.messageArr = self.messageArr.sorted(by: { $0.date < $1.date})
self.collection.reloadData()
self.collection.scrollToLast()
self.messageTextArea.text = ""
})
Редактировать: я удалил все вызовы в основную очередь, и поведение изменилось. Видтеперь будет прокручиваться к вершине представления коллекции, когда метод messageListener запущен, но при использовании того же метода scrollToLast()
в другом месте, представление прокручивается до последнего элемента, как и должно - но только после представленияпрокручивается вручную до дна. Я также пытался переместить код на viewDidAppear
в ответе ниже, но эффекта не было.