2016-10-20 29 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

我的猜測,可能是您的collectionView與鍵盤重疊,因此CollectionView框架不等於您在鍵盤頂部看到的等於屏幕高度的視圖。因此,當您繼續在3之後添加消息時,collectionView將不會滾動,因爲它的contentSize仍然小於其框架,因此滾動到該項目不會產生任何效果,但是當繼續添加消息並且最終輸入第8條消息時,內容大小大於收集視圖框架,因此它滾動。所以當我的解決方案改變了鍵盤的集合框架 –

+0

從頂部邊緣的底部開始到鍵盤的輸入附件視圖頂部:)確保您更新內容大小以及:)現在當你添加第4個消息單元將超出集合視圖框架self.collectionView.scrollToItem效果踢,因此單元格將滾動:D –

+0

每次插入後,內容大小得到更新,我可以實際向下滾動時,他們不滾動通過調用scrollToBottom方法。我總是更新collectionView的內容,以便它始終適合inputAccessoryViewFrameChanged閉包。每當inputAccessory的框架發生更改時(使用觀察者),都會調用閉包。我很確定這不是一個問題,內容插入是不正確的計算。但是,如果它的情況下,請指出我在正確的方向 – 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

相關問題