UICollectionViewController插入无法正确调整和滚动

时间:2019-06-06 22:02:14

标签: 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

1 个答案:

答案 0 :(得分:0)

问题

UICollectionView的一部分进入了键盘下方。

解决方案

您需要增加UICollectionViewkeyboardDidShowNotification上的视图之间的底部约束,并缩小keyboardWillHideNotification上的视图。

逐步

  • UICollectionView和其超级视图之间的底部约束保存为UIViewController类中的一个属性
  • keyboardDidShowNotification上将其高度更改为键盘大小
  • keyboardWillHideNotification上将其高度更改为0

如果您将CollectionViewController子类化

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

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

从通知中设置键盘高度,而不是300。

如果您想从CollectionViewController移出并稍后再创建行为,请按以下步骤操作

  • 改为使用UIViewController
  • 手动添加UICollectionView
  • 手动添加约束,将底部的另存为UIViewController的子类的属性
  • UICollectionView的{​​{1}}和delegate属性设置为dataSource
  • 使用协议一致性扩展您的self(默认情况下,它是为CollectionViewController设置的)
  • 重复步骤