2016-03-14 2 views
2

У меня есть жест нажатия на UILabel, перевод которого анимируется. Всякий раз, когда вы нажимаете на ярлык во время анимации, на жесте крана нет ответа.Tap Gesture при анимации UIView не работает

Вот мой код:

label.addGestureRecognizer(tapGesture) 

    label.userInteractionEnabled = true 
    label.transform = CGAffineTransformMakeTranslation(0, 0) 

    UIView.animateWithDuration(12, delay: 0, options: UIViewAnimationOptions.AllowUserInteraction, animations: {() -> Void in 
     label.transform = CGAffineTransformMakeTranslation(0, 900) 
     }, completion: nil) 

код Жест:

func setUpRecognizers() { 
    tapGesture = UITapGestureRecognizer(target: self, action: "onTap:") 
} 
func onTap(sender : AnyObject) { 
    print("Tapped") 
} 

Любые идеи? Спасибо :)

+2

Может быть, это поможет вам http://stackoverflow.com/questions/26210318/tap-gesture-with-uigesturerecognizerstate-not-working – owlswipe

+0

Показать водопроводный код инициализации жеста. – sschale

+0

@sschale отредактировал – mlevi

ответ

1

Невозможно выполнить то, что вы используете после использования прокси-сервера по одной огромной причине. Захват связан с рамкой метки. Окончательный кадр ярлыков мгновенно изменяется при старте анимации, и вы просто смотрите поддельный фильм (анимация). Если бы вы смогли коснуться (0,900) на экране, он загорелся бы как обычно во время анимации. Однако есть способ сделать это немного иначе. Лучше всего было бы использовать touchhesBegan. Вот расширение, которое я только что написал, чтобы проверить свою теорию, но может быть адаптирован к вашим потребностям. Например, вы можете использовать свой фактический подкласс и получить доступ к свойствам метки без необходимости в циклах.

extension UIViewController{ 

public override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    guard let touch = touches.first else{return} 
    let touchLocation = touch.locationInView(self.view) 

    for subs in self.view.subviews{ 
     guard let ourLabel = subs as? UILabel else{return} 
     print(ourLabel.layer.presentationLayer()) 

     if ourLabel.layer.presentationLayer()!.hitTest(touchLocation) != nil{ 
      print("Touching") 
      UIView.animateWithDuration(0.4, animations: { 
       self.view.backgroundColor = UIColor.redColor() 
       }, completion: { 
        finished in 
        UIView.animateWithDuration(0.4, animations: { 
         self.view.backgroundColor = UIColor.whiteColor() 
         }, completion: { 
          finished in 
        }) 
       }) 
      } 
     } 

    } 
} 

Вы можете видеть, что он проверяет координаты CALayer.presentationLayer() .. Вот что я звоню в кино. Честно говоря, я все еще не полностью обернул голову вокруг уровня презентации и как она работает.

0

Чтобы ваш жест нажатия изменился, вы должны установить количество кранов. Добавьте эту строку:

tapGesture.numberOfTapsRequired = 1

(я предполагаю, что tapGesture тот же один вы звоните label.addGestureRecognizer(tapGesture) с)

+0

Все еще не работает:/ – mlevi

+0

Что делать, если вы заберете ':' в 'onTap:'? – sschale

+0

Это приведет к сбою приложения. ':' сообщает жест нажатия, что он может передавать данные 'sender'. – mlevi

0

Если вы хотите, чтобы увидеть анимацию, вам нужно поместить его в обработчик OnTap ,

let gesture = UITapGestureRecognizer(target: self, action: "onTap:") 
gesture.numberOfTapsRequired = 1 
label.addGestureRecognizer(gesture) 
label.userInteractionEnabled = true 

label.transform = CGAffineTransformMakeTranslation(0, 0) 

UIView.animateWithDuration(12, delay: 3, options: [.AllowUserInteraction], animations: {() -> Void in 
     label.transform = CGAffineTransformMakeTranslation(0, 900) 
     }, completion: nil) 


func onTap(sender : AnyObject) 
{ 

    print("Tapped") 
} 
+0

Мне нужна анимация, чтобы произойти * до * крана. Мне нужно уметь распознавать кран, пока вид перемещение. – mlevi

+0

, если это так, просто измените задержку в исходном коде на 2 - 3 секунды. Я обновил свой ответ. –

+0

: /. Все еще не работает. – mlevi

0

Ниже более общий ответ, основанный на ответ от @ agibson007 в Swift 3.

Это не решить мою проблему немедленно, потому что у меня были дополнительные подвидов, покрывающие мою точку зрения. Если у вас возникли проблемы, попробуйте изменить тип расширения и написать инструкции печати для touchLocation, чтобы узнать, когда функция запускается. Описание в принятом ответе хорошо объясняет проблему.

extension UIViewController { 

    open override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 

     guard let touch = touches.first else { return } 
     let touchLocation = touch.location(in: self.view) 

     for subview in self.view.subviews { 

      if subview.tag == VIEW_TAG_HERE && subview.layer.presentation()?.hitTest(touchLocation) != nil { 

       print("[UIViewController] View Touched!") 
       // Handle Action Here 

      } 

     } 

    } 

} 
Смежные вопросы