2015-06-11 17 views
0

我使用下面的代碼,以便用戶可以將UIImageView劃到任何他們想要的方向。我需要檢測用戶正在滑動的方式。如果它被滑動到左邊,它需要println「向左滑動!」有沒有辦法做到這一點?如何檢測用戶刷卡的方式?

let ThrowingThreshold: CGFloat = 1000 
    let ThrowingVelocityPadding: CGFloat = 35 

    @IBOutlet weak var imageView: UIImageView! 
    @IBOutlet weak var redSquare: UIView! 
    @IBOutlet weak var blueSquare: UIView! 

    private var originalBounds = CGRect.zeroRect 
    private var originalCenter = CGPoint.zeroPoint 

    private var animator: UIDynamicAnimator! 
    private var attachmentBehavior: UIAttachmentBehavior! 
    private var pushBehavior: UIPushBehavior! 
    private var itemBehavior: UIDynamicItemBehavior! 

    func resetDemo() { 
     animator.removeAllBehaviors() 

     UIView.animateWithDuration(0.45) { 
      self.imageView.bounds = self.originalBounds 
      self.imageView.center = self.originalCenter 
      self.imageView.transform = CGAffineTransformIdentity 
     } 
    } 
@IBAction func handleAttachmentGesture(sender: UIPanGestureRecognizer) { 
    let location = sender.locationInView(self.view) 
    let boxLocation = sender.locationInView(self.imageView) 

    switch sender.state { 
    case .Began: 
     println("Your touch start position is \(location)") 
     println("Start location in image is \(boxLocation)") 

     // 1 
     animator.removeAllBehaviors() 

     // 2 
     let centerOffset = UIOffset(horizontal: boxLocation.x - imageView.bounds.midX, 
     vertical: boxLocation.y - imageView.bounds.midY) 
     attachmentBehavior = UIAttachmentBehavior(item: imageView, 
     offsetFromCenter: centerOffset, attachedToAnchor: location) 

     // 3 
     redSquare.center = attachmentBehavior.anchorPoint 
     blueSquare.center = location 

     // 4 
     animator.addBehavior(attachmentBehavior) 

    case .Ended: 
     println("Your touch end position is \(location)") 
     println("End location in image is \(boxLocation)") 

     animator.removeAllBehaviors() 

     // 1 
     let velocity = sender.velocityInView(view) 
     let magnitude = sqrt((velocity.x * velocity.x) + (velocity.y * velocity.y)) 

     if magnitude > ThrowingThreshold { 
     // 2 
     let pushBehavior = UIPushBehavior(items: [imageView], mode: .Instantaneous) 
     pushBehavior.pushDirection = CGVector(dx: velocity.x/10, dy: velocity.y/10) 
     pushBehavior.magnitude = magnitude/ThrowingVelocityPadding 

     self.pushBehavior = pushBehavior 
     animator.addBehavior(pushBehavior) 

     // 3 
     let angle = Int(arc4random_uniform(20)) - 10 

     itemBehavior = UIDynamicItemBehavior(items: [imageView]) 
     itemBehavior.friction = 0.2 
     itemBehavior.allowsRotation = true 
     itemBehavior.addAngularVelocity(CGFloat(angle), forItem: imageView) 
     animator.addBehavior(itemBehavior) 

     // 4 
     let timeOffset = Int64(0.4 * Double(NSEC_PER_SEC)) 
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, timeOffset), dispatch_get_main_queue()) { 
      self.resetDemo() 
     } 
     } else { 
     resetDemo() 
     } 

     default: 
      attachmentBehavior.anchorPoint = sender.locationInView(view) 
      redSquare.center = attachmentBehavior.anchorPoint 
     } 

override func viewDidLoad() { 
    super.viewDidLoad() 
    animator = UIDynamicAnimator(referenceView: view) 
    originalBounds = imageView.bounds 
    originalCenter = imageView.center 
+0

您是否嘗試過使用'translationInView:'? – Wain

+0

不,你如何做到這一點? –

+0

我無法使用它,你能告訴我一個例子嗎? –

回答

0

您可以使用手勢的translationInView功能得到CGPoint表示姿勢的運動,因爲它開始(或自上次重置)。這告訴你在xy方向的相對運動。

如果您對整體運動感興趣,那麼您可以閱讀此圖並使用xy值的符號來確定移動的方向。

如果您對瞬時移動方向感興趣,則可以使用相同的方法,但在閱讀翻譯後,可以使用setTranslation:inView:重設爲CGPointZero。通過這種方式,下一個回調中提供的翻譯就是增量移動。

+0

我真的想弄清楚如何做到這一點,而不需要複製和粘貼代碼,因爲我是新來的swift。我明白你的答案,但我不知道如何寫下來。 –

+0

獲得翻譯,基本上與當前獲得速度的方式相同,最初只是記錄它,以便您可以看到它是如何變化的。然後,看看使用這些值,最初記錄方向,然後使用方向 – Wain

+0

是不是可以使用UISwipeGestures? –