我正在尝试将 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
的一部分在您的键盘下方。
解决方案
您需要在 UICollectionView
和 keyboardDidShowNotification
上的 super View 之间增加底部约束,并在 keyboardWillHideNotification
上缩小它。
一步一步
- 将
UICollectionView
和它的 super View 之间的底部约束保存为UIViewController
类中的属性 - 在
keyboardDidShowNotification
上将其高度更改为键盘大小 - 在
keyboardWillHideNotification
上将其高度更改为 0
如果您子类化 CollectionViewController
更改 scrollInset
属性而不是底部约束。
collectionView.contentInset = UIEdgeInsetsMake(0, 0, 300, 0);
设置您从通知中获得的键盘高度而不是 300。
如果您想要从 CollectionViewController 转移并稍后重新创建行为,请按以下步骤进行操作
- 改用
UIViewController
- 手动添加
UICollectionView
- 手动添加约束,将底部的约束保存为
UIViewController
的子类的属性 - 将
UICollectionView
的delegate
和dataSource
属性设置为self
- 使用协议(protocol)一致性扩展您的
UIViewController
(默认情况下为 CollectionViewController 设置) - 从 重复步骤
关于ios - UICollectionViewController Insets 无法正确调整和滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56485633/