2011-04-11 14 views
5

Bir görüntüyü sürüklemeye çalışıyorum ve bıraktıktan sonra orijinal konumuna geri dönmesine izin veriyorum. (Bu sorunun cevabı görüldüğü gibi: Basic Drag and Drop in iOS) Şimdiye kadar, aşağıdaki kodu kullanarak bir düğme olarak oluşturarak resim sürükleyebilirNesneleri sürükleyip bırakın ve orijinal konumlarına geri döndürün

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]; 

Ve sonra ben tanımlayın:

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

Onu bıraktıktan sonra orijinal konumuna geri dönmesini nasıl sağlayabilirim?, Yeni başlayanlar için her görüntünün geri döndüğü konumu kaydedeceğim, fakat sonra, bir UIImage'ın şu anki konumundan gitmek için hareket ettiğini ve Başka bir? veya başka bir alteratif çözüm?

cevap

-1

Biliyorsun, öylesine burada biraz ikramiye animasyon ile gitmek, bu dün çalışıyordu, ne biliyorum:

- (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); 
} 

Hala birkaç sihirli numaraları vardır ve ben fonksiyonları ve değişkenleri değiştirildi değil örneğinize uygun, ama açık olmalı. Kodumda uzun satırları elle ayırmadığım için girintiyi de yaptım.

0

UIControlEventTouchUpInside ve sonra seçicideki bir seçiciyi çağırmaya ne dersiniz, düğmenizin çerçevesini yeni bir x ve y koordinatına (kaydettiğiniz) ayarlamanız yeterlidir.

+0

Teşekkürler. Fakat bu UIButton'u anında yeni bir konuma taşıyacak, doğru mu?Eğer öyleyse, UIControlEventTouchUpInside seçicisi çağırdığında UIButton'a mevcut konumdan yeni olana geçmek için komut vermek mümkün mü? –

+0

"Animasyon" –

7

UIGestureRecognizer'ın yeni iOS'lar için Apple tarafından önerilmektedir. Sadece UIButton için değil, aynı zamanda UIView (sizin durumunuzda özellikle UIImageView) için de kullanabilirsiniz. Bu yüzden bunu tavsiye etmek istiyorum. arayüzde

:

#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]; 
} 
: dönen etkisini görselleştirmek için
- (void)viewDidLoad { 
    [super viewDidLoad]; 


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

Ve seçicideki

, sadece set animasyon: viewDidLoad yılında

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

, plz UserInteraction etkinleştirmeyi unutmayın

Şerefe,

Tommy

Ben thread Sana (bilinen dropzone dışında serbest varsa) ilk konumuna bir sürüklenen nesnenin dönüşü ilgilenir jenerik sürükle bırak yöneticisi oluşturduk kastediyoruz bağlantılı çözümde
+0

için dokümanlar okuyun, bu karmaşık bir çözüm ya da masumiyet soyutlama yaratmadan doğru çözüm!, Tommy! – Wilson

1

CGPoint Global Olarak veya .h dosyasında tanımlayın nasıl.

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]; 

Ve sonra ben tanımlayın:

- (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 
    } 

o benim projede onu kullanıyorum müthiş nedeni çalışıyor!

İlgili konular