2016-08-29 2 views
3

У меня есть контроллер представления, в котором он имеет вид таблицы и TextView ниже таблицекак двигаться inputView выше клавиатуры при прокрутке таблицы

Когда я нажимаю на TextView появляется клавиатура и когда я нажимаю вне TextView клавиатура disappar Это работает отлично, но у меня есть одна проблема, которая возникает, когда я Перетащите (прокрутите вниз) в виде таблицы. TextView не перемещается вниз с клавиатуры, и я вижу черный фон за клавиатурой, как показано на рисунке ниже.

keyboard disappear with textview

Как решить эту проблему в Swift

Update: Это мой текущий код, наблюдать за keyboardFrameChanges

func keyboardFrameChanged(notification: NSNotification) { 

    let dict = NSDictionary(dictionary: notification.userInfo!) 
    let keyboardValue = dict.objectForKey(UIKeyboardFrameEndUserInfoKey) as! NSValue 
    let bottomDistance = mainScreenSize().height - keyboardValue.CGRectValue().origin.y 
    let duration = Double(dict.objectForKey(UIKeyboardAnimationDurationUserInfoKey) as! NSNumber) 

    UIView.animateWithDuration(duration, animations: { 
     self.inputViewConstraint!.constant = -bottomDistance 
     self.view.layoutIfNeeded() 
     }, completion: { 
      (value: Bool) in 
      self.chatTableView.scrollToBottom(animation: true) 
    }) 

} 

Update 2: я нашел решение, изменив keyboardDismissMode от Интерактивный до OnDrag

chatTableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag 

Это переместит клавиатуры и TextView немедленно вниз, как только это наблюдать любое движение сопротивления в таблице, но как это сделать в режиме Interactive, как с точки зрения WhatsApp чат

ответ

0

Я нашел решение, изменив keyboardDismissMode от Interactive до OnDrag

chatTableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag 

Это переместит клавиатуры и TextView немедленно вниз, как только это наблюдать любое движение сопротивления в таблице

0

Вы могли наблюдать кадр клавиатуры, используя NSNotificationCenter и создайте метод, который будет вызываться при изменении кадра. В этом методе вы получаете координаты клавиатуры и можете соответствующим образом изменить ваш inputView.

override func viewDidLoad() { 
    super.viewDidLoad() 

    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.keyboardDidChangeFrame(_:)), name: UIKeyboardWillChangeFrameNotification, object: nil) 
} 

func keyboardDidChangeFrame(notification: NSNotification) { 
    let keyboardScreenFrameEnd = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue() 
    let keyboardViewFrameEnd = view.convertRect(keyboardScreenEndFrame, fromView: view.window) 

    let keyboardHeight = keyboardViewFrameEnd.height 

    // calculate the offset of your inputView 
    inputView.frame = CGRectOffset(inputView?.frame, ..., ...) 
} 
+0

Я очень начинаю стремительно, вы можете объяснить более подробно –

0

Поиск ответа для этого длился вечно, но это правильный способ реализации этой функции с включенным интерактивным состоянием.

В вашем представлении контроллер, который имеет представление таблицы или коллекции, отображающее чаты, переопределяет inputAccessoryView, а затем возвращает представление, содержащее uitextView или uitextField. и переопределить canBecomeFirstResponder, а затем вернуть true.

override var inputAccessoryView: UIView? { 
    get { 
     self.inputBar.frame.size.height = self.barHeight // 50.0 
     self.inputBar.clipsToBounds = true 
     return self.inputBar 
    } 
} 
override var canBecomeFirstResponder: Bool{ 
    return true 
} 
Смежные вопросы