2011-07-13 12 views
71

UIPanGestureRecognizer कक्षा के कई उदाहरण हैं। उदाहरण के लिए मैं this पढ़ लिया है और मैं अभी भी इसका इस्तेमाल करने में सक्षम नहीं हूँ ...ऑब्जेक्ट को स्थानांतरित करने के लिए UIPanGestureRecognizer का उपयोग कैसे करें? आईफोन/आईपैड

निब फ़ाइल है कि मैं मैं पर काम कर रहा हूँ पर एक UIView (छवि पर सफेद आयत) है कि मुझे लगता है कि वर्ग के साथ खींचें करने के लिए चाहते हैं:

enter image description here

और मेरे .m फ़ाइल में मैं रखा है:

- (void)setTranslation:(CGPoint)translation inView:(UIView *)view 
{ 
    NSLog(@"Test to see if this method gets executed"); 
} 

और कहा कि विधि निष्पादित नहीं प्राप्त करता है जब मैं UIView भर में माउस खींचें। मैंने रखने की भी कोशिश की है:

- (void)pan:(UIPanGestureRecognizer *)gesture 
{ 
    NSLog(@"testing"); 
} 

और वह विधि निष्पादित नहीं होती है। शायद मैं गलत हूं लेकिन मुझे लगता है कि इस विधियों को - (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event विधि की तरह काम करना चाहिए जहां मुझे बस उस विधि को रखना होगा और जब भी स्पर्श हो जाए तो उसे कॉल किया जाएगा।

मैं क्या गलत कर रहा हूं? शायद मुझे उस विधि से कनेक्शन बनाना है? यदि ऐसा है तो मैं यह कैसे कर सकता हूं?

उत्तर

130

मुझे ट्यूटोरियल Working with UIGestureRecognizers मिला, और मुझे लगता है कि मैं यही देख रहा हूं। यह मेरे निम्नलिखित समाधान के साथ आने में मदद मिली:

-(IBAction) someMethod { 
    UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)]; 
    [panRecognizer setMinimumNumberOfTouches:1]; 
    [panRecognizer setMaximumNumberOfTouches:1]; 
    [ViewMain addGestureRecognizer:panRecognizer]; 
    [panRecognizer release]; 
} 

-(void)move:(UIPanGestureRecognizer*)sender { 
    [self.view bringSubviewToFront:sender.view]; 
    CGPoint translatedPoint = [sender translationInView:sender.view.superview]; 

    if (sender.state == UIGestureRecognizerStateBegan) { 
     firstX = sender.view.center.x; 
     firstY = sender.view.center.y; 
    } 


    translatedPoint = CGPointMake(sender.view.center.x+translatedPoint.x, sender.view.center.y+translatedPoint.y); 

    [sender.view setCenter:translatedPoint]; 
    [sender setTranslation:CGPointZero inView:sender.view]; 

    if (sender.state == UIGestureRecognizerStateEnded) { 
     CGFloat velocityX = (0.2*[sender velocityInView:self.view].x); 
     CGFloat velocityY = (0.2*[sender velocityInView:self.view].y); 

     CGFloat finalX = translatedPoint.x + velocityX; 
     CGFloat finalY = translatedPoint.y + velocityY;// translatedPoint.y + (.35*[(UIPanGestureRecognizer*)sender velocityInView:self.view].y); 

     if (finalX < 0) { 
      finalX = 0; 
     } else if (finalX > self.view.frame.size.width) { 
      finalX = self.view.frame.size.width; 
     } 

     if (finalY < 50) { // to avoid status bar 
      finalY = 50; 
     } else if (finalY > self.view.frame.size.height) { 
      finalY = self.view.frame.size.height; 
     } 

     CGFloat animationDuration = (ABS(velocityX)*.0002)+.2; 

     NSLog(@"the duration is: %f", animationDuration); 

     [UIView beginAnimations:nil context:NULL]; 
     [UIView setAnimationDuration:animationDuration]; 
     [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; 
     [UIView setAnimationDelegate:self]; 
     [UIView setAnimationDidStopSelector:@selector(animationDidFinish)]; 
     [[sender view] setCenter:CGPointMake(finalX, finalY)]; 
     [UIView commitAnimations]; 
    } 
} 
+0

कमाल !! मुझे एनीमेशन अवधि की गणना पसंद है, महान काम करता है। – dan

+36

यदि आप स्थानांतरित करते हैं: (आईडी) प्रेषक को स्थानांतरित करने के लिए: (UIPanGestureRecognizer *) प्रेषक आपको उस बदसूरत टाइपकास्टिंग को करने की ज़रूरत नहीं है। – Wex

+1

यह समाधान UISwitch के लिए काम नहीं कर रहा है। इसके अलावा मैंने स्पर्शों को लागू करने की कोशिश की, बायन, छूटे हुए तरीके लेकिन यूआईएसविच को स्थानांतरित करने में सक्षम नहीं। क्या आप कृपया मुझे बता सकते हैं कि मैं खींचकर बस यूआईएसविच कैसे ले जा सकता हूं ?? – DShah

34
UIPanGestureRecognizer * pan1 = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(moveObject:)]; 
pan1.minimumNumberOfTouches = 1; 
[image1 addGestureRecognizer:pan1]; 

-(void)moveObject:(UIPanGestureRecognizer *)pan; 
{ 
image1.center = [pan locationInView:image1.superview]; 
} 
+0

निर्दोष जीत! – MaKo

+0

सादगी के साथ बहस नहीं कर सकता है, लेकिन इस समाधान में कोई समस्या है: जैसे ही आप अपनी उंगली को इशारा शुरू करने के लिए नीचे डालते हैं, 'image1' कूद जाएगा, संभावित रूप से काफी दूर है, ताकि उसका केंद्र आपकी उंगली के नीचे हो। अधिक तरल पदार्थ और मानक अनुभव के लिए 'पैन' के अनुवाद द्वारा 'image1.center' को समायोजित करने के लिए बेहतर। – sartak

21
-(IBAction)Method 
{ 
     UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; 
     [panRecognizer setMinimumNumberOfTouches:1]; 
     [panRecognizer setMaximumNumberOfTouches:1]; 
     [ViewMain addGestureRecognizer:panRecognizer]; 
     [panRecognizer release]; 
} 
- (Void)handlePan:(UIPanGestureRecognizer *)recognizer 
{ 

    CGPoint translation = [recognizer translationInView:self.view]; 
    recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, 
            recognizer.view.center.y + translation.y); 
    [recognizer setTranslation:CGPointMake(0, 0) inView:self.view]; 

    if (recognizer.state == UIGestureRecognizerStateEnded) { 

     CGPoint velocity = [recognizer velocityInView:self.view]; 
     CGFloat magnitude = sqrtf((velocity.x * velocity.x) + (velocity.y * velocity.y)); 
     CGFloat slideMult = magnitude/200; 
     NSLog(@"magnitude: %f, slideMult: %f", magnitude, slideMult); 

     float slideFactor = 0.1 * slideMult; // Increase for more of a slide 
     CGPoint finalPoint = CGPointMake(recognizer.view.center.x + (velocity.x * slideFactor), 
            recognizer.view.center.y + (velocity.y * slideFactor)); 
     finalPoint.x = MIN(MAX(finalPoint.x, 0), self.view.bounds.size.width); 
     finalPoint.y = MIN(MAX(finalPoint.y, 0), self.view.bounds.size.height); 

     [UIView animateWithDuration:slideFactor*2 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{ 
      recognizer.view.center = finalPoint; 
     } completion:nil]; 

    } 

} 
+3

'CGPointMake (0, 0) 'के लिए आप' CGRectZero' लिख सकते हैं। –

+2

@ अर्थ-मामलों क्या आपका मतलब 'CGPointZero' नहीं है? – mylogon

+1

@mylogon आप बिल्कुल सही हैं। मैं आपके कुछ जवाब मेरे धन्यवाद के रूप में कर दूंगा। –

-2

स्विफ्ट 2 संस्करण:

// start detecting pan gesture 
let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(TTAltimeterDetailViewController.panGestureDetected(_:))) 
panGestureRecognizer.minimumNumberOfTouches = 1 
self.chartOverlayView.addGestureRecognizer(panGestureRecognizer) 

func panGestureDetected(panGestureRecognizer: UIPanGestureRecognizer) { 
    print("pan gesture recognized") 
} 
1
if ([recognizer state] == UIGestureRecognizerStateChanged)  
{ 
    CGPoint translation1 = [recognizer translationInView:main_view]; 
    img12.center=CGPointMake(img12.center.x+translation1.x, img12.center.y+ translation1.y); 
    [recognizer setTranslation:CGPointMake(0, 0) inView:main_view]; 

    recognizer.view.center=CGPointMake(recognizer.view.center.x+translation1.x, recognizer.view.center.y+ translation1.y); 
} 

-(void)move:(UIPanGestureRecognizer*)recognizer 
{ 
    if ([recognizer state] == UIGestureRecognizerStateChanged)  
    { 
     CGPoint translation = [recognizer translationInView:self.view]; 
     recognizer.view.center=CGPointMake(recognizer.view.center.x+translation.x, recognizer.view.center.y+ translation.y); 
     [recognizer setTranslation:CGPointMake(0, 0) inView:self.view]; 
    } 
} 
0

तेज 2 @MS AppTech जवाब के संस्करण

func handlePan(panGest : UIPanGestureRecognizer) { 
let velocity : CGPoint = panGest.velocityInView(self.view); 
     let magnitude : CGFloat = CGFloat(sqrtf((Float(velocity.x) * Float(velocity.x)) + (Float(velocity.y) * Float(velocity.y)))); 
     let slideMult :CGFloat = magnitude/200; 
     //NSLog(@"magnitude: %f, slideMult: %f", magnitude, slideMult); 

     let slideFactor : CGFloat = 0.1 * slideMult; // Increase for more of a slide 
     var finalPoint : CGPoint = CGPointMake(panGest.view!.center.x + (velocity.x * slideFactor), 
             panGest.view!.center.y + (velocity.y * slideFactor)); 
     finalPoint.x = min(max(finalPoint.x, 0), self.view.bounds.size.width); 
     finalPoint.y = min(max(finalPoint.y, 0), self.view.bounds.size.height); 

     UIView.animateWithDuration(Double(slideFactor*2), delay: 0, options: UIViewAnimationOptions.CurveEaseOut, animations: { 
      panGest.view!.center = finalPoint; 
      }, completion: nil) 
} 
संबंधित मुद्दे

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