2016-03-14 70 views
2

我對UILabel的翻譯正在進行動畫處理。每當您在動畫中點擊標籤時,輕按手勢都沒有響應。點擊手勢動畫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

您將無法完成您使用tapgesture之後的一大理由。該抽頭與標籤的框架相關聯。開始動畫時,標籤的最終框架會立即更改,而您只是在觀看假影片(動畫)。如果您能夠在屏幕上觸摸(0,900),則會在動畫出現時正常觸發。有一種方法可以做到這一點有點不同。最好的是使用touchesBegan。這是我剛剛寫的一個擴展,用於測試我的理論,但可以根據需要進行調整。例如,您可以使用實際的子類並訪問標籤屬性而不需要循環。

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

這會導致應用程序崩潰。 ':'告訴輕擊手勢它可以將數據傳遞給'發送者'。 – 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

我需要在* tap之前發生的動畫*我需要能夠識別tap,而視圖是移動。 – mlevi

+0

如果是這種情況,只需將原始代碼中的延遲更改爲2至3秒即可。我更新了我的答案。 –

+0

:/。仍然不起作用。 – mlevi

0

下面是斯威夫特3

基於答案來自@ agibson007一個更通用的答案這並沒有馬上解決我的問題,因爲我有額外的子視圖覆蓋我的看法。如果遇到問題,請嘗試更改擴展類型並編寫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 

      } 

     } 

    } 

}