2016-10-20 2 views
4

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)

+0

Мое предположение, может быть, ваша коллекцияView перекрывается клавиатурой, поэтому кадр CollectionView не равен представлению, которое вы видите поверх вашей клавиатуры, но равному высоте экрана. В результате, когда вы продолжаете добавлять сообщения после 3, collectionView не будет прокручиваться, потому что его contentSize по-прежнему меньше, чем его кадр, поэтому прокрутка к элементу не будет иметь никакого эффекта, но при продолжении добавления сообщений и при вводе 8-го сообщения, наконец, размер контента больше, чем рамка просмотра коллекции, поэтому она прокручивается. Таким образом, мое решение меняет структуру коллекции, когда на клавиатуре появляется –

+0

, чтобы начать с нижней границы верхнего края до верхней части входного аксессуара вашей клавиатуры :) убедитесь, что вы также обновили размер содержимого :) теперь, когда u добавить 4-я ячейка сообщения выйдет из рамки просмотра коллекции self.collectionView.scrollToItem эффект ударит и, следовательно, ячейка будет прокручиваться: D –

+0

После каждой вставки размер содержимого обновляется, и я могу фактически прокручивать вниз вручную, когда они не прокручиваются вниз, вызывая метод scrollToBottom. Я всегда обновляю вставку содержимого коллекцииView так, чтобы она всегда входила в закрытие inputAccessoryViewFrameChanged. Закрытие вызывается каждый раз, когда кадр входной переменной изменяется (используя наблюдателей). Я почти уверен, что это не проблема, поскольку вставка содержимого вычисляется неправильно. Однако, если его дело укажет мне в правильном направлении – DatForis

ответ

4

Проблема может быть, когда представление коллекции размер содержание слишком мало, scrollToItem не работает должным образом. Попробуйте использовать этот код

func scrollToBottomAnimated(animated: Bool) { 
     guard self.collectionView.numberOfSections > 0 else{ 
      return 
     } 

     let items = self.collectionView.numberOfItems(inSection: 0) 
     if items == 0 { return } 

     let collectionViewContentHeight = self.collectionView.collectionViewLayout.collectionViewContentSize.height 
     let isContentTooSmall: Bool = (collectionViewContentHeight < self.collectionView.bounds.size.height) 

     if isContentTooSmall { 
      self.collectionView.scrollRectToVisible(CGRect(x: 0, y: collectionViewContentHeight - 1, width: 1, height: 1), animated: animated) 
      return 
     } 

     self.collectionView.scrollToItem(at: NSIndexPath(item: items - 1, section: 0) as IndexPath, at: .bottom, animated: animated) 

    } 
+0

благодарит за работу как шарм – DatForis

Смежные вопросы