Я создаю простое окно чата для чата, и я использую UICollectionView
для своих сообщений о пузыре. Теперь я хочу настроить клавиатуру для правильного отображения и скрытия. Я использовал NSNotifications
и создал функции для keyboardWillShow:
и keyboardWillHide:
событий. Также я устанавливаю keyboardDismissMode
в Интерактивный для моего CollectionView
. Итак, теперь, когда я прокручиваю вверх, и моя клавиатура скрывается (что вызвано отключением Interactive), я также получил keyboardWillHid
e событие, которое сбрасывает мои UIEdgeInsets. Поэтому в основном после того, как я прокручиваю вверх, и моя клавиатура скрыта, мой scrollView
сразу же идет на дно. Моя цель - заставить его работать, как в iMessage.app, WhatsApp и т. Д. Я буду благодарен за любую помощь или совет!Правильно отключайте клавиатуру в swift для collectionView
Вот мой код:
class ViewController: UIViewController {
@IBOutlet weak var collectionView: UICollectionView!
var customView: CustomView!
override func viewDidLoad() {
super.viewDidLoad()
customView = CustomView(frame: CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 40.0))
customView.textView!.delegate = self
collectionView.scrollToBottom(true)
collectionView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.Interactive
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillHide:", name: UIKeyboardWillHideNotification, object: nil)
}
override var inputAccessoryView: UIView! {
get {
if customView == nil {
customView = CustomView()
}
return customView
}
}
override func canBecomeFirstResponder() -> Bool {
return true
}
func keyboardWillShow(notification: NSNotification) {
let userInfo = notification.userInfo ?? [:]
let keyboardFrame = (userInfo[UIKeyboardFrameBeginUserInfoKey] as! NSValue).CGRectValue()
let adjustmentHeight = (CGRectGetHeight(keyboardFrame) + CGRectGetHeight(customView.frame))
let contentInset:UIEdgeInsets
if UIInterfaceOrientationIsPortrait(UIApplication.sharedApplication().statusBarOrientation) {
contentInset = UIEdgeInsetsMake(0, 0, adjustmentHeight, 0)
} else {
contentInset = UIEdgeInsetsMake(0, 0, keyboardFrame.width, 0)
}
collectionView.contentInset = contentInset
collectionView.scrollIndicatorInsets = contentInset
collectionView.scrollToBottom(true)
}
func keyboardWillHide(notification: NSNotification) {
collectionView.contentInset = UIEdgeInsetsZero
collectionView.scrollIndicatorInsets = UIEdgeInsetsZero
}
}
Да, вы абсолютно правы. Когда мое приложение запускается, и моя клавиатура скрыта, вызывается клавиатураWillShow, также когда я увольняю клавиатуру. Может быть, я должен использовать другой метод, например, keyboardDidShow? –
Я подозреваю, что это связано с тем, что inputAccessoryView повторно вводится после скрытой клавиатуры и, следовательно, для вызова. вы можете захотеть переосмыслить, как представлен inputAccessoryView. Также начальный вызов, когда ваше приложение запущено, связано с добавлением вводаAccessoryView и, таким образом, изменение клавиатуры. – alionthego
ну, я переместил код, который делает вставки в textFieldDidBeginEditing, и он работает намного лучше :) –