I have a UIImageView
the user can drag around by using the handleAttachmentGesture
function below. I also have a swipe detector function which I want to println
something when the user swipes something in a direction. The code works until i put in the code that makes the UIImage
draggable. I think the two gestureRecognizers
are interfering with each other, because they won't work together. Is there any way I can fix this?
class theGame: UIViewController {
@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!
let ThrowingThreshold: CGFloat = 1000
let ThrowingVelocityPadding: CGFloat = 35
//DRAGGABLE IMAGE
@IBAction func handleAttachmentGesture(sender: UIPanGestureRecognizer) {
let location = sender.locationInView(self.view)
let boxLocation = sender.locationInView(self.imageView)
switch sender.state {
case .Began:
// 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:
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
}
}
func resetDemo() {
animator.removeAllBehaviors()
UIView.animateWithDuration(0.45) {
self.imageView.bounds = self.originalBounds
self.imageView.center = self.originalCenter
self.imageView.transform = CGAffineTransformIdentity
}
}
//SWIPE DETECTOR
func respondToSwipeGesture(sender: UISwipeGestureRecognizer) {
switch sender.direction {
case UISwipeGestureRecognizerDirection.Left:
if self.imageView.tag == 1 {
println("1 point!")
} else {
if self.imageView.tag == 5 {
println("1 point!")
} else {
println("Game Over!")
}
}
case UISwipeGestureRecognizerDirection.Down:
if self.imageView.tag == 2 {
println("1 point!")
} else {
if self.imageView.tag == 8 {
println("1 point!")
} else {
println("Game Over!")
}
}
case UISwipeGestureRecognizerDirection.Right:
if self.imageView.tag == 3 {
println("1 point!")
} else {
if self.imageView.tag == 7 {
println("1 point!")
} else {
println("Game Over!")
}
}
case UISwipeGestureRecognizerDirection.Up:
if self.imageView.tag == 4 {
println("1 point!")
} else {
if self.imageView.tag == 6 {
println("1 point!")
} else {
println("Game Over!")
}
}
default:
break
}
}
override func viewDidLoad() {
super.viewDidLoad()
animator = UIDynamicAnimator(referenceView: view)
originalBounds = imageView.bounds
originalCenter = imageView.center
var swipeRight = UISwipeGestureRecognizer(target: self, action: "respondToSwipeGesture:")
swipeRight.direction = UISwipeGestureRecognizerDirection.Right
self.view.addGestureRecognizer(swipeRight)
self.view.userInteractionEnabled = true
var swipeLeft = UISwipeGestureRecognizer(target: self, action: "respondToSwipeGesture:")
swipeLeft.direction = UISwipeGestureRecognizerDirection.Left
self.view.addGestureRecognizer(swipeLeft)
self.view.userInteractionEnabled = true
var swipeDown = UISwipeGestureRecognizer(target: self, action: "respondToSwipeGesture:")
swipeDown.direction = UISwipeGestureRecognizerDirection.Down
self.view.addGestureRecognizer(swipeDown)
self.view.userInteractionEnabled = true
var swipeUp = UISwipeGestureRecognizer(target: self, action: "respondToSwipeGesture:")
swipeUp.direction = UISwipeGestureRecognizerDirection.Up
self.view.addGestureRecognizer(swipeUp)
self.view.userInteractionEnabled = true
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}