Swift - addTarget() не работает с addSubview()

Я пытаюсь добавить баннер, который появляется снизу:

Swift - addTarget() не работает с addSubview()

Поэтому я создал UIView с UIButton внутри. Проблема в том, что когда я нажимаю на кнопку, ничего не происходит.

@objc func myButtonAction() {
      print("My Button tapped")
}

func notifBanner(message: String, color: UIColor, backgroundColor: UIColor, button: UIButton){

      let appDelegate = UIApplication.shared.delegate as! AppDelegate
      let window = appDelegate.window!

      if infoViewIsShowing == false{
         infoViewIsShowing = true

         let grey1 = UIColor(red: 196/255, green: 196/255, blue: 196/255, alpha: 1)

         let infoViewHeight = CGFloat(50)
         let infoViewY = window.bounds.height + infoViewHeight

         let infoView = UIView(frame: CGRect(x: 10, y: infoViewY, width: window.bounds.width - 20, height: infoViewHeight))
         infoView.backgroundColor = backgroundColor
         infoView.layer.cornerRadius = 8
         infoView.clipsToBounds = true

         infoView.isUserInteractionEnabled = true
         window.addSubview(infoView)


         infoView.alpha = 0.4

         let widthButton = CGFloat(115)
         let goToProfileButton = UIButton()
         goToProfileButton.frame = CGRect(x: 0, y: 0, width: infoLabelWidth, height: infoLabelHeight)
         goToProfileButton.setTitle("View Profile", for: .normal)
         goToProfileButton.tintColor = .white
         goToProfileButton.addTarget(self, action: #selector(self.myButtonAction), for: .touchUpInside)
         goToProfileButton.titleLabel?.font = UIFont.systemFont(ofSize: 14, weight: UIFont.Weight.semibold)

         infoView.addSubview(goToProfileButton)

         // Animate bannerView
         UIView.animate(withDuration: 0.4, animations: {

            infoView.alpha = 1
            infoView.frame.origin.y = window.bounds.height - infoViewHeight - 60

         }, completion: { (finished: Bool) in
            if finished{

               UIView.animate(withDuration: 0.4, delay: 3, options: .curveEaseIn, animations: {
                  // move up
                  infoView.frame.origin.y = infoViewY
                  infoView.alpha = 0.3

               }, completion: { (finished: Bool) in
                  if finished {
                     infoView.removeFromSuperview()
                     self.infoViewIsShowing = false
                  }
               })

            }
         })
      }
   }

Я попытался добавить infoView.isUserInteractionEnabled = true, но это все еще не работает. У вас есть идеи о том, как я могу отправить действие, когда я нажимаю на кнопку?

Что, если бы вы сделали infoView.isUserInteractionEnabled = false?

Sweeper 06.04.2019 18:01

@Sweeper все еще не работает

KevinB 06.04.2019 18:10

Отладьте иерархию представлений в Xcode и убедитесь, что кнопка находится в пределах рамки суперпредставления, и убедитесь, что кнопка ничем не закрыта.

rmaddy 06.04.2019 18:16

Проблема в animate(), если анимации нет, то она не работает. Но я не знаю, как сохранить анимацию и сохранить функцию addTarget

KevinB 06.04.2019 18:35
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
175
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

вам нужно добавить UITapGestureRecognizer, он будет работать для вас

   let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
myView.addGestureRecognizer(tap)

@objc func handleTap(sender: UITapGestureRecognizer? = nil) {
    // handling code
}
Ответ принят как подходящий

Предполагая, что вы хотите иметь возможность нажимать кнопку в течение 3 секунд, когда вы хотите, чтобы кнопка отображалась, вы можете попробовать изменить код для использования DispatchQueue asyncAfter.

UIView.animate(withDuration: 0.4, animations: {
    infoView.alpha = 1
    infoView.frame.origin.y = window.bounds.height - infoViewHeight - 60
}, completion: { (finished: Bool) in
    if finished{
        DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
            UIView.animate(withDuration: 0.4, delay: 0, options: .curveEaseIn, animations: {
                // move up
                infoView.frame.origin.y = infoViewY
                infoView.alpha = 0.3
            }, completion: { (finished: Bool) in
                if finished {
                    infoView.removeFromSuperview()
                    self.infoViewIsShowing = false
                }
            })
        }
    }
})

Не уверен, почему простое изменение .curveEaseIn на [ .curveEaseIn, .allowUserInteraction ] в исходном коде не сработало.

rmaddy 06.04.2019 19:08

На самом деле, с этим изменением кнопка работала, но ТОЛЬКО во время первой анимации (когда вид переходит снизу вверх на вкладке)

KevinB 06.04.2019 19:12

С кодом в моем ответе кнопка должна работать только в течение 3 секунд, пока кнопка находится в неподвижном состоянии. Добавив .allowUserInteraction к обоим вызовам UIView.animate, кнопка должна работать и во время обеих коротких анимаций.

rmaddy 06.04.2019 19:13

Да это идеально! Спасибо большое

KevinB 06.04.2019 20:25

Другие вопросы по теме