gpt4 book ai didi

ios - UICollectionView 没有滚动到前几个项目的底部

转载 作者:搜寻专家 更新时间:2023-10-30 23:01:20 24 4
gpt4 key购买 nike

我一直在尝试创建一个可以重复使用的聊天界面。我几乎完成了实现,但有些事情一直困扰着我。如果我在第一次加载界面时像 gif 那样开始加载消息,您可以看到在第 4 条消息之后有 3 条消息没有滚动到底部。第 8 个是第一个最终滚动的。这因屏幕尺寸而异。在 iPhone 6s 测试设备上,它到达第 9 条消息,即滚动的消息。

我使用 content inset 作为保持 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 beta (8T29o) 和 iOS 10.1(14B55c) 上运行

最佳答案

问题可能是当 collection view content size 太小时,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)

}

关于ios - UICollectionView 没有滚动到前几个项目的底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40147517/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com