2015-08-22 6 views
0

Я создаю простое окно чата для чата, и я использую 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 
    } 



} 

ответ

2

Ваш CollectionView прокрутки в нижней части, когда вы интерактивно закрыть клавиатуру не потому, что UIEdgeInsets Поступают обнуляется, а потому, что в этой конфигурации метод keyboardWillShow который вызывается снова когда вы отключаете клавиатуру в интерактивном режиме. Предположительно из-за inputAccessoryView. Чтобы проверить это, введите println в свой метод keyboardWillShow и повторите попытку. Я хотел сказать это скорее как комментарий, а не как ответ, но у меня есть только 47 респондентов и мне нужно 50 комментариев. Но я думаю, что эта информация может быть вам полезна.

+0

Да, вы абсолютно правы. Когда мое приложение запускается, и моя клавиатура скрыта, вызывается клавиатураWillShow, также когда я увольняю клавиатуру. Может быть, я должен использовать другой метод, например, keyboardDidShow? –

+0

Я подозреваю, что это связано с тем, что inputAccessoryView повторно вводится после скрытой клавиатуры и, следовательно, для вызова. вы можете захотеть переосмыслить, как представлен inputAccessoryView. Также начальный вызов, когда ваше приложение запущено, связано с добавлением вводаAccessoryView и, таким образом, изменение клавиатуры. – alionthego

+0

ну, я переместил код, который делает вставки в textFieldDidBeginEditing, и он работает намного лучше :) –