ios - UICollectionViewController Insets 无法正确调整和滚动

标签 ios swift uicollectionview

我正在尝试将 UICollectionViewControlller 与 inputAccessoryView 一起用于聊天页面。我使用以下代码尝试将 collectionViewController 滚动到最后一个单元格。

self.collectionView.scrollToItem(at: [0, self.messages.count - 1], at: .bottom, animated: true)

当涉及到键盘时

NotificationCenter.default.addObserver(self, selector: #selector(self.handleKeyboardShow), name: UIResponder.keyboardDidShowNotification, object: nil)

@objc func handleKeyboardShow() {
    print("keyboard was called \(messages.count - 1)")
    self.collectionView.scrollToItem(at: [0, messages.count - 1], at: .bottom, animated: true)
}

这似乎无法正常工作,实际可滚动区域似乎太小,因为当键盘打开时我什至无法手动滚动到最新的单元格。

这是一个示例视频 LINK

最佳答案

问题

UICollectionView 的一部分在您的键盘下方。

解决方案

您需要在 UICollectionViewkeyboardDidShowNotification 上的 super View 之间增加底部约束,并在 keyboardWillHideNotification 上缩小它。

一步一步

  • UICollectionView 和它的 super View 之间的底部约束保存为 UIViewController 类中的属性
  • keyboardDidShowNotification 上将其高度更改为键盘大小
  • keyboardWillHideNotification 上将其高度更改为 0

如果您子类化 CollectionViewController

更改 scrollInset 属性而不是底部约束。

collectionView.contentInset = UIEdgeInsetsMake(0, 0, 300, 0);

设置您从通知中获得的键盘高度而不是 300。

如果您想要从 CollectionViewController 转移并稍后重新创建行为,请按以下步骤进行操作

  • 改用UIViewController
  • 手动添加UICollectionView
  • 手动添加约束,将底部的约束保存为 UIViewController 的子类的属性
  • UICollectionViewdelegatedataSource 属性设置为 self
  • 使用协议(protocol)一致性扩展您的 UIViewController(默认情况下为 CollectionViewController 设置)
  • 重复步骤

关于ios - UICollectionViewController Insets 无法正确调整和滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56485633/

相关文章:

ios - UITableViewCell 内的 UICollectionView

swift - 以编程方式打开 View Controller 并且看不到导航栏。 swift 3

ios - 如何使用 Rxswift 订阅 UISwitch 的值更改控件事件

swift - iMac 在 while 循环后卡住

ios - iPhone iOS 更新 14.7 后 Xcode 12.4 “Unsupported OS version”

ios - 在 Objective C 示例教程中使用 C++ 文件

swift - 绕过 Firebase 创建的唯一自动 ID。 swift 3.0

ios - 我收到此错误,此类与键 collectionView 的键值编码不兼容。 ,

ios - 手动设置时间和日期时,不会触发 iOS 10 中的重复每日本地通知?

ios - 从 PHImageFileURLKey 获取的 URL 读取