2011-04-11 13 views
5

पर वापस लौटें। मैं एक छवि खींचने की कोशिश कर रहा हूं और इसे जारी करने के बाद इसे अपनी मूल स्थिति में वापस जाने देता हूं। (के रूप में इस सवाल का जवाब में देखी गई:: Basic Drag and Drop in iOS) अब तक, मैं निम्नलिखित कोड का उपयोग कर एक बटन के रूप में यह बनाकर चित्र खींच सकते हैंवस्तुओं को खींचें और छोड़ें और उन्हें अपनी मूल स्थिति

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
[button addTarget:self action:@selector(imageTouch:withEvent:) forControlEvents:UIControlEventTouchDown]; 
[button addTarget:self action:@selector(imageMoved:withEvent:) forControlEvents:UIControlEventTouchDragInside]; 
[button setImage:[UIImage imageNamed:@"vehicle.png"] forState:UIControlStateNormal]; 
[self.view addSubview:button]; 

और बाद में मैं निर्धारित करें:

- (IBAction) imageMoved:(id) sender withEvent:(UIEvent *) event 
{ 
    CGPoint point = [[[event allTouches] anyObject] locationInView:self.view]; 
    UIControl *control = sender; 
    control.center = point; 
} 

इसे रिलीज़ करने के बाद मैं इसे अपनी मूल स्थिति में कैसे वापस कर सकता हूं? स्टार्टर्स के लिए मैं उस स्थिति को सहेज लेगा जिस पर प्रत्येक छवि वापस आनी चाहिए, लेकिन फिर भी, यूआईएममेज को वर्तमान स्थिति से जाने और इंगित करने के लिए वैसे भी है एक और एक?, या कोई अन्य परिवर्तनकारी समाधान?

उत्तर

-1

तुम्हें पता है क्या, मैं सिर्फ यह कल पर काम कर रहा था, इसलिए यहाँ आप एक छोटे से बोनस एनीमेशन के साथ जाना:

- (void)previewImageTouchUpInside:(UIButton*)aButton { 
    if (!previewImageDragged) { 
     [self selectPreviewImage:aButton]; 
     return; 
} 

    previewImageDragged = NO; 

    // If user drag photo a little and then release, we'll still treat it as a tap 
    // instead of drag 
    if ((originalPositionOfButton.x - aButton.center.x) * 
     (originalPositionOfButton.x - aButton.center.x) + 
     (originalPositionOfButton.y - aButton.center.y) * 
     (originalPositionOfButton.y - aButton.center.y) < 10) { 
     aButton.center = originalPositionOfButton; 
     [self selectPreviewImage:aButton]; 
     return; 
    } 

    [UIView animateWithDuration:0.5 
     delay:0 
     options:UIViewAnimationOptionCurveEaseOut | 
     UIViewAnimationOptionAllowUserInteraction animations:^{ 
     aButton.center = originalPositionOfButton; 
    } completion:nil]; 
} 



- (void)previewImageDraggedInside:(UIButton*)aButton event:(UIEvent*)event { 
    if (!previewImageDragged) { 
     originalPositionOfButton = aButton.center; 
     [self.view bringSubviewToFront:aButton]; 
     [self.view bringSubviewToFront:[self.view viewWithTag:CHOOSE_PHOTO_BUTTON_TAG]]; 
    } 

    UITouch* touch = [[event allTouches] anyObject]; 

    previewImageDragged = YES; 
    aButton.center = CGPointMake(aButton.center.x+[touch locationInView:self.view].x- 
     [touch previousLocationInView:self.view].x, 
     aButton.center.y+[touch locationInView:self.view].y- 
     [touch previousLocationInView:self.view].y); 
} 

यह अभी भी कुछ जादुई संख्या है और मैं कार्य करता है और चर का नाम बदला नहीं किया है अपने उदाहरण के अनुरूप, लेकिन यह स्पष्ट होना चाहिए। मैंने यहां इंडेंटेशन भी किया क्योंकि मैं अपने कोड में मैन्युअल रूप से लंबी लाइनें नहीं तोड़ता हूं।

0

UIControlEventTouchUpInside पर चयनकर्ता को कॉल करने के बारे में और फिर चयनकर्ता में, बस अपने बटन का एक नया एक्स और वाई समन्वय (जिसे आपने सहेजा है) पर सेट करें।

+0

धन्यवाद। लेकिन यह UIButton को तुरंत एक नई स्थिति में ले जायेगा, है ना?यदि ऐसा है, तो UIControlEventTouchUpInside पर चयनकर्ता को कॉल करने के बाद UIButton को इसकी वर्तमान स्थिति से आगे बढ़ने के लिए आदेश देना संभव है? –

+0

अब तक "एनीमेशन" –

7

हालिया आईओएस के लिए ऐप्पल द्वारा UIGestureRecognizer की सिफारिश की जाती है। आप इसे केवल यूआईबटन के लिए ही नहीं, बल्कि UIView (विशेष रूप से UIImageView आपके मामले में) आदि के लिए भी उपयोग कर सकते हैं, इसलिए मैं इसकी अनुशंसा करना चाहता हूं।

इंटरफ़ेस में:

#pragma mark - 
#pragma mark UIPanGestureRecognizer selector 
- (void) dragGesture:(UIPanGestureRecognizer *) panGesture{ 
    CGPoint translation = [panGesture translationInView:self.view]; 

    switch (panGesture.state) { 
     case UIGestureRecognizerStateBegan:{ 
      originalCenter = dragImage.center; 
     } 
      break; 
     case UIGestureRecognizerStateChanged:{ 
      dragImage.center = CGPointMake(dragImage.center.x + translation.x, 
              dragImage.center.y + translation.y); 
     } 
      break; 
     case UIGestureRecognizerStateEnded:{    
      [UIView animateWithDuration:kImageReturnTime 
          animations:^{ 
           dragImage.center = originalCenter; 
          } 
          completion:^(BOOL finished){ 
           NSLog(@"Returned"); 
          }]; 
     } 
      break; 
     default: 
      break; 
    } 

    [panGesture setTranslation:CGPointZero inView:self.view]; 
} 
: लौटने प्रभाव कल्पना करने के लिए

- (void)viewDidLoad { 
    [super viewDidLoad]; 


    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self 
                       action:@selector(dragGesture:)]; 
    [dragImage addGestureRecognizer:panGesture]; 
    [dragImage setUserInteractionEnabled:YES]; 
} 

और इसकी चयनकर्ता में, मैं सिर्फ सेट एनीमेशन:

@interface TestDragViewController : UIViewController { 
    IBOutlet UIImageView *dragImage; 
    CGPoint originalCenter; 
} 

viewDidLoad में, plz userInteraction सक्षम करने के लिए याद

चीयर्स,

टॉमी

+0

के लिए दस्तावेज़ पढ़ें, जटिलताओं के बिना या अनावश्यक abstractions बनाने के लिए यह सही समाधान है !, अच्छी तरह से किया Tommy! – Wilson

0

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

देखें कुछ कैसे generic drag and drop solution in iOS

1

परिभाषित CGPoint विश्व स्तर पर, या ज फ़ाइल में।

CGPoint point;   

     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
     [button addTarget:self action:@selector(imageTouch:withEvent:)forControlEvents:UIControlEventTouchDown]; 
     [button addTarget:self action:@selector(imageMoved:withEvent:) forControlEvents:UIControlEventTouchDragInside]; 
     [button setImage:[UIImage imageNamed:@"vehicle.png"] forState:UIControlStateNormal]; 
     [self.view addSubview:button]; 

और बाद में मैं निर्धारित करें:

- (IBAction) imageMoved:(UIButton*) sender withEvent:(UIEvent *) event 
{ 
point = [[[event allTouches] anyObject] locationInView:self.view]; 
UIControl *control = sender; 
control.center = point; 
[sender addTarget:self action:@selector(touches:withEvent:) forControlEvents:UIControlEventTouchUpInside]; 
} 

-(void)touches:(UIButton *)button withEvent:(UIEvent *)event { 

[UIView animateWithDuration:0.1 delay:0 options:UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionAllowUserInteraction animations:^{ 
    button.center = point; 

} completion:^(BOOL finished){ 
    if (finished) { 
    // do anything yu want 
    } 

यह भयानक कारण मैं अपने प्रोजेक्ट में यह उपयोग कर रहा हूँ काम करता है!

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