UISwipeGestureRecognizer не вызывает функцию в UITextView

У меня есть объект UITextView, который отображает сообщение об ошибке. Объект падает сверху экрана, как уведомление. По умолчанию он остается неподвижным в течение 5 секунд, а затем снова поднимается над видом, а затем удаляется из супервида. Я добавил UISwipeGestureRecognizer в представление, однако при тестировании прикрепленная функция не вызывается. Кто-нибудь может увидеть, что не так?

class ErrorMessage : UITextView {

override init(frame: CGRect, textContainer: NSTextContainer?) {
  super.init(frame: frame, textContainer: textContainer)
  setupViews()
}

required init?(coder: NSCoder) {
  super.init(coder: coder)
}

private func setupViews() {
  //ATTRIBUTES & CONSTRAINTS DECLARED HERE ETC...

  self.isUserInteractionEnabled = true
  self.isMultipleTouchEnabled = true

  let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(hideError))
  swipeUp.direction = .up
  self.addGestureRecognizer(swipeUp)
}

@objc func hideError() {

  print(true)

}

Здесь я инициализирую код в другом UIView.

let errorMessage = TopMessage()
self.addSubview(errorMessage)
errorMessage.translatesAutoresizingMaskIntoConstraints = false
errorMessage.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 20).isActive = true
errorMessage.rightAnchor.constraint(equalTo: self.rightAnchor, constant: -20).isActive = true

let bottomConstraint = NSLayoutConstraint(item: errorMessage, attribute: .bottom, relatedBy: .equal, toItem: rootVC.view.safeAreaLayoutGuide, attribute: .top, multiplier: 1.0, constant: 0)
NSLayoutConstraint.activate([bottomConstraint])
errorMessage.sizeToFit()
errorMessage.text = "⚠️ Too many reset attempts. Try again later."

//Custom Animation function that I created, just makes constraint changes so the object goes from being hidden above the top of the view, to being constrained to the top safe area.
errorMessage.present(rootVC: rootVC, bottomConstraint: bottomConstraint, relatedItem: rootVC.view.safeAreaLayoutGuide)

person Elliot Fisher    schedule 22.01.2020    source источник
comment
Можете ли вы показать, где и как вы создаете свой текстовый вид? Вы используете раскадровку или создаете ее в коде? Действительно ли вызывается setupViews?   -  person shim    schedule 23.01.2020
comment
Привет, да, setupViews вызывается, сообщение появляется как обычно, но просто не могу провести по нему жестом   -  person Elliot Fisher    schedule 23.01.2020


Ответы (3)


Сначала ваш класс должен принять UIGestureRecognizerDelegate и установить ваш жест в качестве делегата. Затем вы должны добавить функцию UIGestureRecognizer, shouldRecognizeSimultaneousWith otherGestureRecognizer. И, наконец, вызовите setupViews() в требуемом файле init.

class ErrorMessage : UITextView, UIGestureRecognizerDelegate {

override init(frame: CGRect, textContainer: NSTextContainer?) {
    super.init(frame: frame, textContainer: textContainer)
    setupViews()
}

required init?(coder: NSCoder) {
    super.init(coder: coder)
    swipeGestureRecognizer()
}

private func setupViews() {
    //ATTRIBUTES & CONSTRAINTS DECLARED HERE ETC...
    self.isUserInteractionEnabled = true
    self.isMultipleTouchEnabled = true
}

@objc func hideError() {
    print(true)
}

func swipeGestureRecognizer() {
    let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(hideError))
    swipeUp.delegate = self
    swipeUp.direction = .up
    self.addGestureRecognizer(swipeUp)
}

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

}

Сработало для меня, я надеюсь, что это поможет вам.

person Dimitris Papaioannou    schedule 22.01.2020
comment
Спасибо Димитрис за ответ. Я внес указанные вами изменения, но теперь ничего не появляется? Когда я возвращаю setupViews() обратно в переопределение инициализации, объект снова появляется, но в требуемой инициализации ничего не появляется? - person Elliot Fisher; 23.01.2020
comment
Просто отметим, что я инициализирую TextView в коде, а не в раскадровке. - person Elliot Fisher; 23.01.2020
comment
Я добавил редактирование туда, где я инициализирую объект - person Elliot Fisher; 23.01.2020
comment
Возможно, вам следует отделить функцию setupViews. Продолжайте настраивать элементы пользовательского интерфейса в ваших setupViews, которые вызываются внутри override init, и попробуйте создать метод с вашим UISwipeGestureRecognizer и вызовите эту функцию внутри требуемого init. Дай мне знать, если это работает. (Я только что отредактировал свой ответ, вы можете проверить это). - person Dimitris Papaioannou; 23.01.2020
comment
Это не сработало, я поместил печать (true) в редактирование, чтобы увидеть, вызывалась ли функция swipeGestureRecognizer(), но когда она требует инициализации, ничего не выводится на консоль, предполагая, что она не вызывается? - person Elliot Fisher; 23.01.2020

Я нашел свой ответ здесь.

UIButton не взаимодействует во время анимации

Я убрал анимацию, которая выполнялась на объекте в момент взаимодействия и стал работать свайп. Установка альфа-канала на 0,1 вместо 0,0 и установка параметров на .allowUserInteraction сделали TextView интерактивным во время анимации.

person Elliot Fisher    schedule 23.01.2020

person    schedule
comment
Спасибо за этот фрагмент кода, который может предоставить некоторую ограниченную немедленную помощь. правильное объяснение значительно улучшит его долгосрочную ценность, показав, почему это хорошее решение проблемы и сделать его более полезным для будущих читателей с другими, похожими вопросами. Пожалуйста, отредактируйте свой ответ, чтобы добавить некоторые пояснения, включая сделанные вами предположения. - person Ismael Padilla; 23.01.2020