UICollectionView не прокрутка вниз на первые несколько пунктов
я пытался создать интерфейс чата, что я могу повторно использовать. Я почти закончил реализацию, но есть что-то, что меня раздражает. Если я начну загружать сообщения, например, в gif, когда я впервые загружу интерфейс, вы увидите, что после 4-го сообщения есть 3 сообщения, которые не прокручиваются в нижнюю часть. С восьмым - первым, которое, наконец, прокручивается. Это зависит от размера экрана. На устройстве тестирования iPhone 6s оно достигает 9-го сообщения, которое прокручивается.
Я использую контент врезку в качестве способа сохранить CollectionView видимого со следующим кодом выполняющимся каждый раз, когда кадр UIToolbar в нижней части изменения
toolBar.inputAccessoryViewFrameChanged = {(rect: CGRect) in Void()
let navigationAndStatusHeight = self.navigationController != nil && self.navigationController!.navigationBar.isTranslucent ? self.navigationController!.navigationBar.frame.size.height + UIApplication.shared.statusBarFrame.height : 0
self.collectionView.contentInset = UIEdgeInsets(top: navigationAndStatusHeight + 8, left: 8, bottom: UIScreen.main.bounds.height - rect.origin.y + 8, right: 8)
self.collectionView.scrollIndicatorInsets.bottom = UIScreen.main.bounds.height - rect.origin.y
}
Этот код запускается каждый раз, когда новый сообщение вставляется:
func insertNewMessage(){
self.collectionView.performBatchUpdates({
self.collectionView.insertItems(at: [NSIndexPath(item: self.numberOfMessages() - 1, section: 0) as IndexPath])
}) { (Bool) in
self.scrollToBottom(animated: true)
}
}
с функцией scrollToBottom существа:
func scrollToBottom(animated: Bool){
guard self.numberOfMessages() > 0 else{
return
}
self.collectionView.scrollToItem(at: IndexPath(item: self.numberOfMessages() - 1, section: 0), at: UICollectionViewScrollPosition.top , animated: animated)
}
я в настоящее время работает на этой версии XCode версии 8.1 бета (8T29o) & IOS 10.1 (14B55c)
Мое предположение, может быть, ваша коллекцияView перекрывается клавиатурой, поэтому кадр CollectionView не равен представлению, которое вы видите поверх вашей клавиатуры, но равному высоте экрана. В результате, когда вы продолжаете добавлять сообщения после 3, collectionView не будет прокручиваться, потому что его contentSize по-прежнему меньше, чем его кадр, поэтому прокрутка к элементу не будет иметь никакого эффекта, но при продолжении добавления сообщений и при вводе 8-го сообщения, наконец, размер контента больше, чем рамка просмотра коллекции, поэтому она прокручивается. Таким образом, мое решение меняет структуру коллекции, когда на клавиатуре появляется –
, чтобы начать с нижней границы верхнего края до верхней части входного аксессуара вашей клавиатуры :) убедитесь, что вы также обновили размер содержимого :) теперь, когда u добавить 4-я ячейка сообщения выйдет из рамки просмотра коллекции self.collectionView.scrollToItem эффект ударит и, следовательно, ячейка будет прокручиваться: D –
После каждой вставки размер содержимого обновляется, и я могу фактически прокручивать вниз вручную, когда они не прокручиваются вниз, вызывая метод scrollToBottom. Я всегда обновляю вставку содержимого коллекцииView так, чтобы она всегда входила в закрытие inputAccessoryViewFrameChanged. Закрытие вызывается каждый раз, когда кадр входной переменной изменяется (используя наблюдателей). Я почти уверен, что это не проблема, поскольку вставка содержимого вычисляется неправильно. Однако, если его дело укажет мне в правильном направлении – DatForis