我一直在試圖建立一個聊天界面,我可以重複使用。我幾乎完成了這個實現,但是有一些事情讓我煩惱。如果我在第一次加載界面時像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)
我的猜測,可能是您的collectionView與鍵盤重疊,因此CollectionView框架不等於您在鍵盤頂部看到的等於屏幕高度的視圖。因此,當您繼續在3之後添加消息時,collectionView將不會滾動,因爲它的contentSize仍然小於其框架,因此滾動到該項目不會產生任何效果,但是當繼續添加消息並且最終輸入第8條消息時,內容大小大於收集視圖框架,因此它滾動。所以當我的解決方案改變了鍵盤的集合框架 –
從頂部邊緣的底部開始到鍵盤的輸入附件視圖頂部:)確保您更新內容大小以及:)現在當你添加第4個消息單元將超出集合視圖框架self.collectionView.scrollToItem效果踢,因此單元格將滾動:D –
每次插入後,內容大小得到更新,我可以實際向下滾動時,他們不滾動通過調用scrollToBottom方法。我總是更新collectionView的內容,以便它始終適合inputAccessoryViewFrameChanged閉包。每當inputAccessory的框架發生更改時(使用觀察者),都會調用閉包。我很確定這不是一個問題,內容插入是不正確的計算。但是,如果它的情況下,請指出我在正確的方向 – DatForis