2012-07-20 5 views
0

작업중인 iOS 응용 프로그램의 경우 사용자 장치의 모든 이미지가 화면의 한 부분에 표시됩니다. 사용자는 이미지를 화면의 다른 부분으로 드래그하여 메모리 게임에 사용될 이미지 세트에 이미지를 추가 할 수 있어야합니다. 여기 UIControl에서 끌기 이벤트 리디렉션

해당 이미지의 약간 작은 반투명 버전들이 만들어집니다 내 설명은 사용자가 내가 일을하고 싶은 어떤 이미지를 드래그 할 때 A screenshot to make things more clear

를 시각화하기 어려운 경우 스크린 샷입니다 아래쪽으로 아래로 드래그하지만 원본 이미지는 그대로 유지됩니다. 나는 새로운 이미지를 산란시킬 수 있고 심지어 새로운 이미지를 움직이는 표적을 할당 할 수있다. 내가 겪고있는 문제는 사용자가 화면에서 손가락을 들어서 다시 드래그하기 시작해야하는 새로운 이미지를 드래그하는 것입니다. 새 이미지에서 이전 이미지 드래그 이벤트를 가져오고 싶습니다. 이것은 내가 지금 가지고있는 코드입니다.

UIControl *mask = [[UIControl alloc]initWithFrame:frame]; 
[mask addSubview:img]; 
[mask addTarget:self action:@selector(dragExited:withEvent:) forControlEvents:UIControlEventTouchDragExit]; 
[scrImages addSubview:mask]; 


-(IBAction)dragExited:(id)sender withEvent:(UIEvent*)event 
{ 
    UIControl *control = sender; 
    [control resignFirstResponder]; 
    UIImageView *img = [control.subviews objectAtIndex:0]; 
    CGPoint point = [[[event allTouches]anyObject]locationInView:self.view]; 
    UIControl *mask = [[UIControl alloc]initWithFrame:CGRectMake(0, 0, img.image.size.width, img.image.size.height)]; 
    mask.center = point; 
    [mask addSubview:[[UIImageView alloc]initWithImage:img.image]]; 
    [mask addTarget:mask action:@selector(removeFromSuperview) forControlEvents:UIControlEventTouchUpInside]; 
    [self.view addSubview:mask]; 
    [mask addTarget:self action:@selector(thumbnailMoved:withEvent:) forControlEvents:UIControlEventTouchDragInside]; 
    [mask touchesMoved:nil withEvent:nil]; 
} 

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

나는 [mask touchesMoved:nil withEvent:nil];를 호출하여 드래그 프로세스를 시작하려하지만 그건 작동하지 않습니다. 어떤 아이디어?

답변

2

나는 다른 기술, pan gestures으로 이것을 대답 할 것이다. 나는 당신의 기술을 사용하지 않는, 그래서 그것을 말할 수는 없지만, 나는 다음과 같은 모든 시간을 사용

- (void)handlePanImage:(UIPanGestureRecognizer *)sender 
{ 
    static CGPoint originalCenter; 
    static UIImageView *imageview; 

    if (sender.state == UIGestureRecognizerStateBegan) 
    { 
     UIImageView *selectedImageView = (UIImageView *) sender.view; 
     imageview = [[UIImageView alloc] initWithFrame:selectedImageView.frame]; 
     imageview.image = selectedImageView.image; 
     imageview.alpha = 0.8; 
     [sender.view.superview addSubview:imageview]; 

     originalCenter = imageview.center; 
    } 
    else if (sender.state == UIGestureRecognizerStateChanged) 
    { 
     CGPoint translation = [sender translationInView:sender.view.superview]; 

     imageview.center = CGPointMake(originalCenter.x + translation.x, originalCenter.y + translation.y); 
    } 
    else if (sender.state == UIGestureRecognizerStateEnded) 
    { 
     [imageview removeFromSuperview]; 
     imageview = nil; 

     CGPoint translation = [sender translationInView:sender.view.superview]; 

     // do whatever you want to at the end, in this case, animating the moving 
     // of the old image to the new location. perhaps you don't want to move your 
     // old image, but leave it there, maybe you just want to change the alpha of 
     // what you dragged back to 1.0 and snap it into place. Just do whatever you 
     // want here. Note, in this latter scenario, if you want to be able to drag 
     // the new image back out, you'll have to create a new pan gesture recognizer 
     // for it. 

     [UIView animateWithDuration:0.2 
         animations:^{ 
          sender.view.center = CGPointMake(originalCenter.x + translation.x, originalCenter.y + translation.y);; 
         }]; 
    } 
    else if (sender.state == UIGestureRecognizerStateCancelled || sender.state == UIGestureRecognizerStateFailed) 
    { 
     [imageview removeFromSuperview]; 
     imageview = nil; 
    } 
} 

당신도 할 수 있습니다 내가 핸들러가 다음

UIPanGestureRecognizer *pan; 

pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanImage:)]; 
image01.userInteractionEnabled = YES; 
[self.image01 addGestureRecognizer:pan]; 

pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanImage:)]; 
image02.userInteractionEnabled = YES; 
[self.image02 addGestureRecognizer:pan]; 

과 각 이미지에 대해 새로운 제스처 인식기를 생성하는 대신 상위 뷰에 하나씩 이미지를 만들고 이미지를 감지 한 다음 계속 수행하십시오. 다음

UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanSuperView:)]; 
[self.view addGestureRecognizer:pan]; 

: 그리고 그처럼 보일 수 있습니다 그것은 멋지다

- (void)handlePanSuperView:(UIPanGestureRecognizer *)sender 
{ 
    static CGPoint originalCenter; 
    static UIImageView *selectedImageView = nil; 
    static UIImageView *draggedImageView = nil; 

    if (sender.state == UIGestureRecognizerStateBegan) 
    { 
     selectedImageView = nil; 
     CGPoint location = [sender locationInView:sender.view]; 
     for (UIImageView *imageview in _imageviews) 
     { 
      if (CGRectContainsPoint(imageview.frame, location)) 
       selectedImageView = imageview; 
     } 
     if (selectedImageView) 
     { 
      draggedImageView = [[UIImageView alloc] initWithFrame:selectedImageView.frame]; 
      draggedImageView.image = selectedImageView.image; 
      draggedImageView.alpha = 0.8; 
      [sender.view addSubview:draggedImageView]; 

      originalCenter = selectedImageView.center; 
     } 
    } 
    else if (sender.state == UIGestureRecognizerStateChanged && selectedImageView) 
    { 
     CGPoint translation = [sender translationInView:sender.view]; 

     draggedImageView.center = CGPointMake(originalCenter.x + translation.x, originalCenter.y + translation.y); 
    } 
    else if (sender.state == UIGestureRecognizerStateEnded && selectedImageView) 
    { 
     [draggedImageView removeFromSuperview]; 
     draggedImageView = nil; 

     CGPoint translation = [sender translationInView:sender.view]; 

     // do whatever you want to at the end, in this case, animating the moving of the old image 

     [UIView animateWithDuration:0.2 
         animations:^{ 
          selectedImageView.center = CGPointMake(originalCenter.x + translation.x, originalCenter.y + translation.y);; 
         }]; 
    } 
    else if ((sender.state == UIGestureRecognizerStateCancelled || sender.state == UIGestureRecognizerStateFailed) && selectedImageView) 
    { 
     [draggedImageView removeFromSuperview]; 
     draggedImageView = nil; 
    } 
} 
+0

내가 월요일에 일을 얻을 때, 나는 그에게 기회를 줄 것이다. 감사 – nick