Предотвращение сенсорного перехода от UIControl к ParentView - PullRequest
0 голосов
/ 27 сентября 2018

Я создал собственный элемент управления для Uber, такой как OTP TextField.Я хочу использовать прикосновение в моем контроле и не позволять ему распространяться по цепочке UIResponder.Поэтому я переопределил методы, описанные в документации Apple.

extension BVAPasswordTextField {
override func touchesBegan(_ touches: Set<UITouch>,  with event: UIEvent?) {
   becomeFirstResponder()
  }

  override func touchesMoved(Set<UITouch>, with: UIEvent?) {

}

override func touchesEnded(Set<UITouch>, with: UIEvent?) {

}

override func touchesCancelled(Set<UITouch>, with: UIEvent?) {

 }

override func touchesEstimatedPropertiesUpdated(Set<UITouch>) {

  }
}

Теперь в некоторых контроллерах представления я хочу отключить клавиатуру, когда пользователь нажимает где-то вне моего пользовательского элемента управления.

override func viewDidLoad() {
    super.viewDidLoad()
    let tapGestureRecogniser = UITapGestureRecognizer(target: self, action: #selector(ViewController.backgroundTapped))
    tapGestureRecogniser.numberOfTapsRequired = 1
    view.addGestureRecognizer(tapGestureRecogniser)
    // Do any additional setup after loading the view, typically from a nib.
}

@objc func backgroundTapped() {
    self.view.endEditing(true)
}

Но всякий раз, когда я нажимаю на текстовое поле, backgroundTapped также вызывается.

Примечание: - Это элемент управления, основанный наenum значения вы можете создавать различные компоненты пользовательского интерфейса для ввода данных.Таким образом, этот контроль может быть разделен всей командой ... Я не буду единственным парнем, использующим его .... Поэтому я хочу, чтобы он вел себя точно так же, как сценарий UITextfield in touch

1 Ответ

0 голосов
/ 27 сентября 2018

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

extension ViewController: UIGestureRecognizerDelegate {
    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        let location = gestureRecognizer.location(in: self.view)
        // return true is location of touch is outside our textField
        return !textField.frame.contains(location)
    }
}

Просто убедитесь, что вы установили delegate для своего жеста на viewDidLoad

tapGestureRecogniser.delegate = self

ОБНОВЛЕНИЕ

Если я правильно выполнил настройку, у вас есть представление и некоторые подпредставления, которые используются для ввода.И вы хотите resignFirstResponder, когда этот super-view коснулся.В этом случае вы можете использовать gestureRecognizerShouldBegin вот так

func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
    let location = gestureRecognizer.location(in: self.view)
    for subview in self.view.subviews {
        if subview.frame.contains(location) {
            return false
        }
    }
    return true
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...