NSCollectionView滚动到底部

问题描述 投票:2回答:2

我有一个NSCollectionView,它包含消息传递应用程序中的几十行单列项目(聊天消息)。

每个项目都包含高度不同的文本区域。因此,视图应在创建视图时默认为底部,并在收到新消息时滚动到底部。

我正在努力将滚动默认为底部或者弄清楚如何获取CollectionView内容的高度以滚动到底部。

任何帮助将不胜感激,谢谢!

macos cocoa appkit
2个回答
0
投票

如果您仅支持macOS 10.11及更高版本,并且如果您使用NSCollectionViewLayout,则可以向layouter询问整个内容的大小。这也是滚动条的大小。

所以,在ObjC中,你只需要向你的collectionView询问其layouter的内容大小并滚动到底部:

NSSize contentSize = theCollectionView.collectionViewLayout.collectionViewContentSize.height;

[theCollectionView.enclosingScrollView.contentView scrollPoint:NSMakePoint(0, contentSize.height)];

-1
投票

嗨,我建议您使用Offset进行水平UICollectionView和Apple为垂直UICollectionView提供底部方法

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)
  }

}

UICollectionView垂直滚动到底部

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)
          }
      }
   }
}

UITableView滚动到底部

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)
© www.soinside.com 2019 - 2024. All rights reserved.