Привязка кнопки (UIView) к клавиатуре, которая работает в нескольких текстовых полях (Swift 4.2) - PullRequest
0 голосов
/ 16 ноября 2018

Извините, если на любые похожие вопросы был дан ответ. Но я просто не могу понять это.

Я достиг своей цели - привязать кнопку «Войти» к клавиатуре, толкая ее от нижней части экрана к верхней части клавиатуры, используя расширение ниже.

изображение: начальный вид без клавиатуры.

изображение: клавиатура запущена.

My UIView расширение:

import UIKit

 extension UIView{
 func bindToKeyboard(){
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange(_:)), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
}


@objc func keyboardWillChange(_ notification: NSNotification){
    let duration = notification.userInfo![UIResponder.keyboardAnimationDurationUserInfoKey] as! Double
    let curve = notification.userInfo![UIResponder.keyboardAnimationCurveUserInfoKey] as! UInt
    let beginningFrame = (notification.userInfo![UIResponder.keyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
    let endFrame = (notification.userInfo![UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
    let deltaY = endFrame.origin.y - beginningFrame.origin.y

    UIView.animateKeyframes(withDuration: duration, delay: 0.0, options: UIView.KeyframeAnimationOptions(rawValue: curve), animations: {
        self.frame.origin.y += deltaY
    }, completion: nil)
   }
}

и я позвонил с bindToKeyboard() на loginBtn в viewDidLoad() моего LoginVC следующим образом:

loginBtn.bindToKeyboard()

Проблема в том, что после первого нажатия на текстовое поле (поле электронной почты или пароль) кнопка исчезает. После того, как клавиатура закрыта, кнопка фактически возвращается в исходное положение, как на первом рисунке. После повторного вызова клавиатуры, нажав одно из этих текстовых полей, кнопка работает правильно. Но второй и пр. Нажмите , это не так.

Суть моего вопроса:

  1. как я могу реализовать расширение для правильной работы с несколькими текстовыми полями / текстовыми представлениями?
  2. Если это невозможно, как мне подойти к этой проблеме?

Извините, если мое объяснение и / или английский неясны.

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

У меня была точно такая же проблема, и первоначально я попытался обработать ее с помощью метода UIKeyboardNotification, но проблема заключалась в том, что редактировалось другое UITextField, когда клавиатура изменила свое состояние, она не будет регистрироваться ни для какого состоянияизменить, как это было уже активно.Поэтому после долгих исследований я справился с этим путем создания accessoryView с новой кнопкой, которая является дублированием моей реальной кнопки.Итак, в основном, учтите, что у вас есть UIButton, который торчит в нижней части UIViewController, и у вас есть 2 UITextField, который при взаимозаменяемости не может чувствовать, что UIButton когда-либо перемещался в другое место, но остается застрявшим на клавиатуре,Следующий фрагмент кода объясняет, как решить эту проблему:

@IBOutlet weak var signInBtn: UIButton!
@IBOutlet weak var passwordTextField: UITextField!
@IBOutlet weak var emailTextField: UITextField!

var accessoryViewKeyboard:UIView?
var btnAccessory:UIButton?


override func viewDidLoad() {
    super.viewDidLoad()

    passwordTextField.delegate = self
    emailTextField.delegate = self

    accessoryViewKeyboard = UIView(frame: signInBtn.frame)

    //Inputting the "accessoryViewKeyboard" here as the "inputAccessoryView" is of 
    //utmost importance to help the "signInBtn" to show up on tap of different "UITextFields"
    emailTextField.inputAccessoryView = accessoryViewKeyboard
    passwordTextField.inputAccessoryView = accessoryViewKeyboard

    setupBtnWithKeyboard()
}

func setupBtnWithKeyboard() {
    btnAccessory = UIButton(frame: CGRect(x: signInBtn.frame.origin.x, y: signInBtn.frame.origin.y, width: self.view.frame.size.width, height: signInBtn.frame.size.height))
    accessoryViewKeyboard?.addSubview(btnAccessory!)
    btnAccessory?.translatesAutoresizingMaskIntoConstraints = false
    btnAccessory?.frame = CGRect(x: (accessoryViewKeyboard?.frame.origin.x)!,
                                 y: (accessoryViewKeyboard?.frame.origin.y)!,
                                 width: self.view.frame.size.width,
                                 height: (accessoryViewKeyboard?.frame.size.height)!)

    btnAccessory?.backgroundColor = UIColor(red: 31/255, green: 33/255, blue: 108/255, alpha: 1)
    btnAccessory?.setTitle("Sign In", for: .normal)
    btnAccessory?.titleLabel?.font = .systemFont(ofSize: 22)
    btnAccessory?.titleLabel?.textColor = UIColor.white
    btnAccessory?.titleLabel?.textAlignment = .center
    btnAccessory?.isEnabled = true
    btnAccessory?.addTarget(self, action: #selector(SignIn.signInBtnPressed), for: .touchUpInside)

    NSLayoutConstraint.activate([
        btnAccessory!.leadingAnchor.constraint(equalTo:
            accessoryViewKeyboard!.leadingAnchor, constant: 0),
        btnAccessory!.centerYAnchor.constraint(equalTo:
            accessoryViewKeyboard!.centerYAnchor),
        btnAccessory!.trailingAnchor.constraint(equalTo:
            accessoryViewKeyboard!.trailingAnchor, constant: 0),
        btnAccessory!.heightAnchor.constraint(equalToConstant: signInBtn.frame.size.height),
        ])
}

И все готово.Это сохранит UIButton всегда присутствующим на клавиатуре.Важная вещь, независимо от того, сколько экземпляров UITextField вы вводите, всегда вводите accessoryViewKeyboard как inputAccessoryView.

0 голосов
/ 19 ноября 2018

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

    UIView.animateKeyframes(withDuration: duration, delay: 0.0, options: UIView.KeyframeAnimationOptions(rawValue: curve), animations: {
    self.frame.origin.y += deltaY
}, completion: nil)

Я использую эту анимацию хорошо после снятия всех ограничений с UIButton. В противном случае self.frame.origin.y += deltaY следует заменить константой ограничения.

Удачи с движущимися кнопками.

...