2

팬 제스처 기능을 이미지 뷰에 구현하려는 경우이 이미지 뷰는 스크롤 뷰의 하위 뷰입니다. 문제는 내가 scrollview 스크롤하려고 할 때 이미지 뷰의 팬 제스처가 인식되면 및 scrollview 스크롤하지 않습니다. 도와주세요. UIImageView의 팬 제스처가 스크롤을 방해합니다.

이있는 UIImageView에 팬을 초기화하는 코드입니다 :

UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)]; 
      [panRecognizer setMinimumNumberOfTouches:1]; 
      [panRecognizer setMaximumNumberOfTouches:1]; 
      [panRecognizer setDelegate:self]; 
      [[[scrollView subviews] objectAtIndex:i] addGestureRecognizer:panRecognizer]; 

는 이미지 뷰가 설정 한 사용자가 "YES"

하고

-(void)move:(UIPanGestureRecognizer *)sender 
{ 
    [[[[[sender view] superview] superview] superview] bringSubviewToFront:sender.view]; 


    if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateBegan) { 

     if ([[[sender view] superview] superview] == itemView) // adds the imageview in the item scroll 
     { 
      int tag = [[sender view] tag]/100; 
      UIScrollView *tempScroll = (UIScrollView *)[itemView viewWithTag:-tag]; 
      CGRect frame = CGRectFromString([itemFrameDict objectForKey:[NSString stringWithFormat:@"%i",[[sender view] tag]]]); 

      CGAffineTransform transform = temp.transform; 
      UIImageView *tempImageView = [[UIImageView alloc] initWithImage: [(UIImageView *) [sender view] image]]; 
      tempImageView.tag = [[sender view] tag]; 
      //NSLog(@"[sender view] superview] : %@", [[sender view] superview]); 
      tempImageView.frame = frame; 
      [tempImageView setTransform:transform]; 
      [tempImageView setFrame:frame]; 
      [tempImageView setUserInteractionEnabled:YES]; 
      [tempScroll addSubview:tempImageView]; 

      UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)]; 
      [panRecognizer setMinimumNumberOfTouches:1]; 
      [panRecognizer setMaximumNumberOfTouches:1]; 
      [panRecognizer setDelegate:self]; 
      [tempImageView addGestureRecognizer:panRecognizer]; 

      UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]; 
      [singleTapGestureRecognizer setNumberOfTapsRequired:1]; 
      [tempImageView addGestureRecognizer:singleTapGestureRecognizer]; 
     } 
    } 

    if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateChanged) 
    { 
     CGPoint translatedPoint = [sender locationInView:[[sender view] superview]] ; 
     newTranslatedPoint = [[[sender view] superview] convertPoint:translatedPoint toView:self.view]; 

     if ([sender view].frame.size.width == 35 && [sender view].frame.size.height == 35) 
      [[sender view] sizeToFit]; 

     [sender view].center = CGPointMake(newTranslatedPoint.x, newTranslatedPoint.y); //startFrame; 

     [self.view addSubview:[sender view]]; 
    } 

    if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded) 
    { 
     CGPoint newPoint = [[[sender view] superview] convertPoint:newTranslatedPoint toView:itemView]; 
     if (newPoint.y < 0)// || !viewUp) 
     { 
      //NSLog(@" baseView"); 
      [baseView addSubview:[sender view]]; 

      UITapGestureRecognizer *doubleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)]; 
      [doubleTapGestureRecognizer setNumberOfTapsRequired:2]; 
      [[sender view] addGestureRecognizer:doubleTapGestureRecognizer]; 

      UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scale:)]; 
      [pinchRecognizer setDelegate:self]; 
      [[sender view] addGestureRecognizer:pinchRecognizer]; 

      UIRotationGestureRecognizer *rotationRecognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotate:)]; 
      [rotationRecognizer setDelegate:self]; 
      [[sender view] addGestureRecognizer:rotationRecognizer]; 
     } 

     else if (newPoint.y > 0)// && viewUp) 
     { 
      //NSLog(@" itemView"); 
      int tag = [[sender view] tag]/100; 
      UIScrollView *tempScroll = (UIScrollView *)[itemView viewWithTag:-tag]; 
      CGRect frame = CGRectFromString([itemFrameDict objectForKey:[NSString stringWithFormat:@"%i",[[sender view] tag]]]); 

      CGAffineTransform transform = temp.transform; 
      [[sender view] setTransform:transform]; 
      [[sender view] setFrame:frame]; 
      [tempScroll addSubview:[sender view]]; 
     } 
    } 
} 
+0

팬 제스처의 구현에서 수행 한 작업을 보여주십시오. – Zen

+0

또한 IB를 사용하는 동안 기본적으로 'UIImageView'는 사용자 상호 작용을 사용할 수 없습니다. 이미지 뷰의 제스처 인식기의 경우이를 활성화해야합니다. – Zen

+0

나는 실제로 내가 드래그를 구현, 그리고 난 이미이 구현 여기 – Khushboo

답변

3

I에 대한 작업을하는 이미 UIScrollView에있는 UIImageViewUIPanGestureRecognizer을 사용하여 정확하게 달성하려는 내용을 잘 모릅니다. 그러나 설명에 따르면, UIScrollView이 그 일을하고 UIPanGestureRecognizer이이를 차단하지 않기를 바라는 것처럼 들립니다. 난 당신이 UIPanGestureRecognizer이 대리자 메서드를 구현해야 믿습니다

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
    return YES; 
} 

동시 제스처 인식을 허용에 관해서의 UIGestureRecognizerDelegate Protocol reference을 읽어 보시기 바랍니다. 문서에 따르면 :

기본 구현은 아니오 - 두 개의 제스처를 반환합니다. 동시에 을 인식 할 수 있습니다. UIPanGestureRecognizer - Only vertical or horizontal: 에서

/* 편집 */

UIPanGestureRecognizer에 대한 하나의 방향을 구현합니다. 다음은 수직 팬을위한 것입니다.

- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)panGestureRecognizer { 
    CGPoint translation = [panGestureRecognizer translationInView:someView]; 
    return fabs(translation.y) > fabs(translation.x); 
} 
+0

을 사용하고있는 코드를 추가 한 @zen - (BOOL) gestureRecognizer : (UIGestureRecognizer *) gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer : (UIGestureRecognizer *) otherGestureRecognizer { 을 return YES; } – Khushboo

+0

을 드롭 기능 – Khushboo

+0

@Khushboo UIScrollView 내에서 UIImageView를 이동하려고합니다. UIScrollView는 세로/가로 또는 둘 다 스크롤 만 할 수 있습니까? – DonnaLea

관련 문제