2016-03-12 7 views
6

मैं कई दिनों के लिए स्विफ्ट 2.2 सीख रहा हूं। आधिकारिक ट्यूटोरियल खत्म करने के बाद, मैं कुछ कार्यात्मक नमूने बनाने की कोशिश कर रहा हूं। जैसे मैं अवतार सजावटी बनाने की कोशिश कर रहा हूं।स्विफ्ट: पैनिंग (ड्रैगिंग) के बाद चिकनी जड़ता कैसे बनाएं?

@IBAction func moveAvatar(recognizer:UIPanGestureRecognizer) { 
    recognizer.maximumNumberOfTouches = 1 
    recognizer.minimumNumberOfTouches = 1 
    let debugOutOfBounds = false 
    let debugGestureRecognizer = false 
    let debugVelocity = true 
    if (debugGestureRecognizer) { 
     print("pan") 
    } 
    let translation = recognizer.translationInView(self.avatar) 

    let standardAvatarSize:CGFloat = Conf.Size.avatarRadius * 2 
    if (self.avatar.frame.width < standardAvatarSize) { 
     self.avatar.frame = CGRect(origin: self.avatar.frame.origin, size: CGSize(width: standardAvatarSize, height:standardAvatarSize)) 
    } 
    if let view = recognizer.view { 
     switch recognizer.state { 
     case .Began: 
      if (debugVelocity) { 
       print("Began: velocity: \(recognizer.velocityInView(view)) translation: \(translation)") 
      } 

      self.panAvatarLastTranslation = translation 
      self.avatar.center = CGPoint(x: self.avatar.center.x + translation.x, y: self.avatar.center.y + translation.y) 
     case .Changed: 
      if (debugVelocity) { 
       print("Changed: velocity: \(recognizer.velocityInView(view)) translation: \(translation)") 
      } 
      if (translation != CGPoint(x: 0.0, y: 0.0)) { 
       self.panAvatarLastTranslation = translation 
      } 
      self.avatar.center = CGPoint(x: self.avatar.center.x + translation.x, y: self.avatar.center.y + translation.y) 
     case .Ended: 
      if (debugVelocity) { 
       print("Ended: velocity: \(recognizer.velocityInView(view)) translation: \(translation)") 
      } 
      let velocityDistance = sqrt(pow(recognizer.velocityInView(view).x, CGFloat(2)) + pow(recognizer.velocityInView(view).y, CGFloat(2))) 
      print(velocityDistance) 
      if (velocityDistance > 100) { 
       let inertiaDelay: NSTimeInterval = 0.5 
       let inertiaDistance : CGFloat = velocityDistance * CGFloat(inertiaDelay) * 0.02 
       let inertiaX:CGFloat = self.panAvatarLastTranslation.x * inertiaDistance 
       let inertiaY:CGFloat = self.panAvatarLastTranslation.y * inertiaDistance 
            //sqrt(pow(inertiaX, CGFloat(2)) + pow(inertiaY, CGFloat(2))) 
       //print("inertiaDelay: \(inertiaDelay)") 
       UIView.animateWithDuration(inertiaDelay, animations: { 
        self.avatar.center.x += inertiaX 
        self.avatar.center.y += inertiaY 
       }) 
      } 
     default: 
      print("default") 
     } 

     let standardAvatarBound: [String:CGFloat] = [ 
      "top": UIApplication.sharedApplication().statusBarFrame.height + UIScreen.mainScreen().bounds.width/2 - Conf.Size.avatarRadius, 
      "right": UIScreen.mainScreen().bounds.width/2 + Conf.Size.avatarRadius, 
      "bottom": UIApplication.sharedApplication().statusBarFrame.height + UIScreen.mainScreen().bounds.width/2 + Conf.Size.avatarRadius, 
      "left": UIScreen.mainScreen().bounds.width/2 - Conf.Size.avatarRadius 
     ] 
     let avatarBound: [String:CGFloat] = [ 
      "top": self.avatar.center.y - self.avatar.frame.height/2, 
      "right": self.avatar.frame.width/2 + self.avatar.center.x, 
      "bottom": self.avatar.center.y + self.avatar.frame.height/2, 
      "left": self.avatar.center.x - self.avatar.frame.width/2 
     ] 

     if (self.panAvatarLastTranslation.x < 0 && avatarBound["right"] < standardAvatarBound["right"]) { 
      UIView.animateWithDuration(0.5, animations: { 
       self.avatar.center.x += (standardAvatarBound["right"]! - avatarBound["right"]!) 
      }) 
      if (debugOutOfBounds) { 
       print("Out of right bound") 
      } 
     } 

     if(self.panAvatarLastTranslation.x > 0 && avatarBound["left"] > standardAvatarBound["left"]) { 
      UIView.animateWithDuration(0.5, animations: { 
       self.avatar.center.x -= (avatarBound["left"]! - standardAvatarBound["left"]!) 
      }) 
      if (debugOutOfBounds) { 
       print("Out of left bound") 
      } 
     } 

     if(self.panAvatarLastTranslation.y > 0 && avatarBound["top"] > standardAvatarBound["top"]) { 
      UIView.animateWithDuration(0.5, animations: { 
       self.avatar.center.y -= (avatarBound["top"]! - standardAvatarBound["top"]!) 
      }) 
      if (debugOutOfBounds) { 
       print("Out of top bound") 
      } 
     } 
     if(self.panAvatarLastTranslation.y < 0 && avatarBound["bottom"] < standardAvatarBound["bottom"]) { 
      UIView.animateWithDuration(0.5, animations: { 
       self.avatar.center.y += (standardAvatarBound["bottom"]! - avatarBound["bottom"]!) 
      }) 
      if (debugOutOfBounds) { 
       print("Out of bottom bound") 
      } 
     } 
    } 
    recognizer.setTranslation(CGPointZero, inView: view) 
} 

ठीक है, जैसा कि आप देख सकते हैं कि मैं पैन इशारा पहचानकर्ता के ".Ended" राज्य में जड़ता खींच से निपटने कर रहा हूँ। यह अच्छी तरह से काम करता है, लेकिन चिकनी नहीं है। चिकनी पैनिंग जड़ता बनाने के लिए मैं क्या कर सकता हूं? https://github.com/AarioAi/NotesOpen/tree/master/Swift

उत्तर

1

एनिमेट के लिए अलग विधि का उपयोग कर प्रयास करें:

यहाँ स्रोत कोड है। this tutorial

संबंधित मुद्दे