我有一个NSCollectionView
,它包含消息传递应用程序中的几十行单列项目(聊天消息)。
每个项目都包含高度不同的文本区域。因此,视图应在创建视图时默认为底部,并在收到新消息时滚动到底部。
我正在努力将滚动默认为底部或者弄清楚如何获取CollectionView内容的高度以滚动到底部。
任何帮助将不胜感激,谢谢!
如果您仅支持macOS 10.11及更高版本,并且如果您使用NSCollectionViewLayout
,则可以向layouter询问整个内容的大小。这也是滚动条的大小。
所以,在ObjC中,你只需要向你的collectionView询问其layouter的内容大小并滚动到底部:
NSSize contentSize = theCollectionView.collectionViewLayout.collectionViewContentSize.height;
[theCollectionView.enclosingScrollView.contentView scrollPoint:NSMakePoint(0, contentSize.height)];
嗨,我建议您使用Offset进行水平UICollectionView和Apple为垂直UICollectionView提供底部方法
extension UICollectionView {
func scrollToNextItem() {
let contentOffset = CGFloat(floor(self.contentOffset.x + self.bounds.size.width))
self.moveToFrame(contentOffset: contentOffset)
}
func scrollToPreviousItem() {
let contentOffset = CGFloat(floor(self.contentOffset.x - self.bounds.size.width))
self.moveToFrame(contentOffset: contentOffset)
}
func moveToFrame(contentOffset : CGFloat) {
let frame: CGRect = CGRect(x: contentOffset, y: self.contentOffset.y , width: self.frame.width, height: self.frame.height)
self.scrollRectToVisible(frame, animated: true)
}
}
extension UICollectionView {
func scrollToBottom(animated: Bool) {
let sections = self.numberOfSections
if sections > 0 {
let rows = self.numberOfItems(inSection: sections - 1)
let last = IndexPath(row: rows - 1, section: sections - 1)
DispatchQueue.main.async {
self.scrollToItem(at: last, at: .bottom, animated: animated)
}
}
}
}
extension UITableView {
func scrollToBottom(animated: Bool) {
let sections = self.numberOfSections
if sections > 0 {
let rows = self.numberOfRows(inSection: sections - 1)
let last = IndexPath(row: rows - 1, section: sections - 1)
DispatchQueue.main.async {
self.scrollToRow(at: last, at: .bottom, animated: animated)
}
}
}
}
self.collectionView.scrollToBottom(animated: true)
self.tableView.scrollToBottom(animated: true)