При смене вставок вида прокрутки они нежелательно анимируются с отображением и скрытием клавиатуры.
Это для обмена сообщениями в моем приложении.Когда я хочу вызвать клавиатуру, мне нужно немедленно изменить размер представления прокрутки представления коллекции, в котором отображаются сообщения
import UIKit
class ViewController: UIViewController, UICollectionViewDataSource,
UICollectionViewDelegateFlowLayout, UICollectionViewDelegate {
@IBOutlet weak var myCollectionView: UICollectionView!
@IBOutlet weak var textfield: UITextField!
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 20
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
cell.backgroundColor = UIColor.random()
return cell
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 0
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 0
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: collectionView.bounds.width, height: 50)
}
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardNotification), name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardNotification), name: UIResponder.keyboardWillHideNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardDidHide), name: UIResponder.keyboardDidHideNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardDidShow), name: UIResponder.keyboardDidShowNotification, object: nil)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
}
@objc func handleKeyboardDidHide(notification: NSNotification){
//we only wanna do this if we're at the bottom
// if checkIfScrolledToPosition(distanceFromBottom: 0) {
//
// self.scrollToBottomOfCollectionView(animated: true)
// }
}
@objc func handleKeyboardDidShow(notification: NSNotification){
//temp commented for testing
// if shouldScrollToBottomOnceKeyboardShow{
// self.scrollToBottomOfCollectionView(animated: true)
// shouldScrollToBottomOnceKeyboardShow = false
// }
}
@objc func handleKeyboardNotification(notification: NSNotification?){
if let keyboardFrame: NSValue = notification?.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
let keyboardRectangle = keyboardFrame.cgRectValue
let keyboardHeight = keyboardRectangle.height
let isKeyboardShowing = notification!.name == UIResponder.keyboardWillShowNotification
if isKeyboardShowing{
setCollectionViewScrollInsets(heightFromBottom: keyboardHeight)
}else{
setCollectionViewScrollInsets(heightFromBottom: 0)
}
}
}
@IBAction func button(_ sender: Any) {
textfield.resignFirstResponder()
}
func setCollectionViewScrollInsets(heightFromBottom: CGFloat){
// messagesCollectionView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: heightFromBottom, right: 0)
myCollectionView.scrollIndicatorInsets = UIEdgeInsets(top: 0, left: 0, bottom: heightFromBottom, right: 0)
//myCollectionView.layoutIfNeeded()//without this is seems to cause severe fuck up
}
}
Я ожидаю, что представление прокрутки мгновенно изменит размер, но фактическоеизменение происходит постепенно и анимируется с помощью клавиатуры.Я подозреваю, что это связано с обновлением макета в рамках какого-то скрытого метода, связанного с отображением клавиатуры, но это влияет на остальную часть представления.
Возможным решением этой проблемы может быть принудительная прокрутка.чтобы прокручиваться вниз, пока отображается клавиатура, мне не нужно беспокоиться о мгновенном изменении вкладышей, если кто-нибудь знает, как это сделать.