Высота вида, который находится внутри вида карты, снизу экрана?(Перемещение вид над клавиатурой, когда она открывается) - PullRequest
0 голосов
/ 12 сентября 2018

У меня довольно сложная ситуация.Это связано с перемещением вида над клавиатурой.У меня есть вид чата, очень похожий на одно приложение Сообщения Apple.Тем не менее, это внутри карты, которая не заполняет весь экран.Над и под этой картой находятся панель навигации и панель вкладок.

Теперь я хочу переместить редактируемый UITextView (где пользователь составляет свое сообщение) над клавиатурой, когда он нажимает на нее.У меня есть высота клавиатуры (с помощью NotificationCenter Observer), но мне нужно вычесть ее из высоты текстового обзора (внутри карты) из высоты клавиатуры, чтобы вычислить, на какое расстояние я должен сместить текстовое представление.Скорее всего, поможет картинка:

Вот мой стек просмотра: Вид -> Просмотр карты -> ScrollView (который содержит просмотр списка сообщений и просмотр таблицы чата) -> TextBox View (содержит UITextView, кнопку отправки и т. Д.)

Это выполнимо?Есть ли лучший способ сделать это?Я застрял и довольно новичок в манипулировании представлениями в отношении клавиатуры.

Вот клочки кода, которые у меня есть:

    fileprivate var keyboardHeight = CGFloat()
    
    @objc fileprivate func keyboardWillShow(notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
            let keyboardHeight = keyboardSize.height
            self.keyboardHeight = keyboardHeight
        }
    }
    
    fileprivate func moveTextView(textView: UITextView, moveDistance: Int, up: Bool) {
        let moveDuration = 0.3
        let movement = CGFloat(up ? moveDistance : -moveDistance)
        
        UIView.animate(withDuration: moveDuration) {
            self.snp.updateConstraints({ (make) in
                make.bottom.equalToSuperview().offset(movement)
            })
            
            self.superview?.layoutIfNeeded()
        }
        
    }

extension TextBarView: UITextViewDelegate {
    func textViewDidBeginEditing(_ textView: UITextView) {
        moveTextView(textView: textView, moveDistance: -200, up: true)
    }
    
    func textViewDidEndEditing(_ textView: UITextView) {
        moveTextView(textView: textView, moveDistance: -200, up: false)
    }
    
    func textViewShouldEndEditing(_ textView: UITextView) -> Bool {
        textView.resignFirstResponder()
        return true
    }
}

Я использую SnapKit для автоматического размещения.

(Если вы прочитали весь этот пост, спасибо!)

...