Текстовое представление перемещается выше, чем ожидалось на клавиатуре WillWhowNotification для Iphone X - PullRequest
0 голосов
/ 12 февраля 2020

для функции, которую я назвал handleKeyboardWillShow , мое входное текстовое поле перемещается выше, чем ожидалось. Я намерен прикрепить текстовое поле к верхней части клавиатуры. Я также добавил код для создания текстового поля, которое, кажется, вызывает проблему.

Here is an image depicting my error

Создание переменной textField

  lazy var inputTextField: UITextField = {
    let tf = UITextField()
    tf.placeholder = "Enter message..."
    tf.translatesAutoresizingMaskIntoConstraints = false
    tf.delegate = self
    return tf
}()

Мой просмотр загружал функцию

    override func viewDidLoad() {
    super.viewDidLoad()
    collectionView.contentInset = UIEdgeInsets(top: 8, left: 0, bottom: 8, right: 0)
    collectionView.alwaysBounceVertical = true
    collectionView.register(ChatMessageCell.self, forCellWithReuseIdentifier: cellId)
    collectionView.backgroundColor = .white
    collectionView.keyboardDismissMode = .interactive
    becomeFirstResponder()
    setUpInputComponents()
    setUpKeyboardObserver()

}

Просмотр исчезнет, ​​где я удаляю наблюдателей

 override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)
    //MARK: IMPORTANT FOR SHOWING AND HIDING KEYBOARD TO AVOID MEMORY LEAKS
    NotificationCenter.default.removeObserver(self)
}

func setUpKeyboardObserver(){
    NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)

    NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}

@objc func handleKeyboardWillShow(notification:NSNotification){
    let keyboardFrame = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect
            let keyboardDuration = (notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as AnyObject).doubleValue
    let safeLayoutGuideBot = UIApplication.shared.keyWindow?.safeAreaInsets.bottom
    let height =  (keyboardFrame?.height)! - safeLayoutGuideBot!
    containerViewBottomAnchor?.constant = -height
    UIView.animate(withDuration: keyboardDuration!, animations: {
        self.view.layoutIfNeeded()
    })
}

@objc func handleKeyboardWillHide(notification:NSNotification){
    let keyboardDuration = (notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as AnyObject).doubleValue
    containerViewBottomAnchor?.constant = 0
    UIView.animate(withDuration: keyboardDuration!, animations: {
        self.view.layoutIfNeeded()
    })
}

Это где макет для рассматриваемого textView и контейнерного представления.

var containerViewBottomAnchor: NSLayoutConstraint?

func setUpInputComponents(){
    let containerView = UIView()
    containerView.translatesAutoresizingMaskIntoConstraints = false
    containerView.backgroundColor = .white
    view.addSubview(containerView)

    containerView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
    containerViewBottomAnchor =  containerView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
    containerViewBottomAnchor?.isActive = true
    containerView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
    containerView.heightAnchor.constraint(equalToConstant: 50).isActive = true

    containerView.addSubview(sendButton)
    sendButton.rightAnchor.constraint(equalTo: containerView.rightAnchor).isActive = true
    sendButton.centerYAnchor.constraint(equalTo: containerView.centerYAnchor).isActive = true
    sendButton.widthAnchor.constraint(equalToConstant: 80).isActive = true
    sendButton.heightAnchor.constraint(equalTo: containerView.heightAnchor).isActive = true

    containerView.addSubview(inputTextField)
    inputTextField.leftAnchor.constraint(equalToSystemSpacingAfter: containerView.leftAnchor, multiplier: 8).isActive = true
    inputTextField.centerYAnchor.constraint(equalTo: containerView.centerYAnchor).isActive = true
    inputTextField.rightAnchor.constraint(equalTo: sendButton.leftAnchor).isActive = true
    inputTextField.heightAnchor.constraint(equalTo: containerView.heightAnchor).isActive = true

    containerView.addSubview(seperatorLineView)
    seperatorLineView.leftAnchor.constraint(equalTo: containerView.leftAnchor).isActive = true
    seperatorLineView.topAnchor.constraint(equalTo: containerView.topAnchor).isActive = true
    seperatorLineView.widthAnchor.constraint(equalTo: containerView.widthAnchor).isActive = true
    seperatorLineView.heightAnchor.constraint(equalToConstant: 0.5).isActive = true
}

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Возможно, это исправление было взломом, но я решил его, реализовав следующее

        containerViewBottomAnchor?.constant -= (keyboardFrame?.height)! - 100

Статически вычитая значение 100 из высоты рамки клавиатуры.

0 голосов
/ 12 февраля 2020

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

@objc func keyboardShown(_ notification: Notification) {
    let keyboardEndFrameWindow = (notification as NSNotification).userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue
    let keyboardTransitionDuration = (notification as NSNotification).userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as! NSNumber
    let keyboardTransitionAnimationCurve = (notification as NSNotification).userInfo?[UIResponder.keyboardAnimationCurveUserInfoKey] as! NSNumber

    let keyboardEndFrameView = self.view.convert(keyboardEndFrameWindow.cgRectValue, from:nil)
    var offsetY = keyboardEndFrameView.minY - self.nameField.frame.maxY;
    offsetY = min(offsetY, 0);

    UIView.animate(withDuration: TimeInterval(keyboardTransitionDuration.doubleValue),
        delay: 0.0,
        options: UIView.AnimationOptions(rawValue: keyboardTransitionAnimationCurve.uintValue),
        animations: { () -> Void in
            self.view.frame = self.view.frame.offsetBy(dx: 0, dy: offsetY)
    }, completion: nil)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...