2013-04-13 6 views
1

사용자가 버튼을 탭하고 앱이 이미지 레이어 (UIImageView)를 인스턴스화하는 앱이 있습니다. 사용자가 선택한 이미지 레이어를 탭으로 이동시킬 수 있도록 만들고 싶습니다. 여기에 몇 가지 주제를 읽은 후 UIPanGestureRecognizer을 사용하여 선택한 이미지 레이어를 이동할 수 있음을 알게되었습니다.UIPanGestureRecognizer 및 BringSubviewToFront

- (IBAction)buttonClicked:(id)sender { 
    imageview = [[UIImageView alloc] initWithFrame:CGRectMake(100, 0, 300, 22)]; 
    UIPanGestureRecognizer *imageviewGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(recognizePan:)]; 
    [imageviewGesture setMinimumNumberOfTouches:1]; 
    [imageviewGesture setMaximumNumberOfTouches:1]; 
    imageview.image = [UIImage imageNamed:@"pinimage.png"]; 
    [imageview addGestureRecognizer:imageviewGesture]; 
    [imageview setUserInteractionEnabled:YES]; 
    [self.view addSubview:imageview]; 
    NSUInteger currentag = [self UniqueTag]; // Assigning a unique integer 
    imageview.tag = currentag; 
} 

- (void)recognizePan:(UIPanGestureRecognizer *)sender { 
    [[[(UITapGestureRecognizer *)sender view] layer] removeAllAnimations]; 
    [self.view bringSubviewToFront:[(UIPanGestureRecognizer *)sender view]]; 
    CGPoint translatedPoint = [(UIPanGestureRecognizer *)sender translationInView:self.view]; 

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

    translatedPoint = CGPointMake(firstX + translatedPoint.x,firstY + translatedPoint.y); 
    [[sender view] setCenter:translatedPoint]; 
} 

이제는 여러 개의 이미지 레이어가있을 때 탭된 레이어를 앞에 가져 오는 방법을 알 수 없습니다. [self.view bringSubviewToFront : [(UIPanGestureRecognizer *) 보낸 사람보기]]가 효과적이지 않은 것 같습니다. 그렇다면 응용 프로그램이 탭된 레이어를 다른 레이어로 이동하도록 코드를 수정하려면 어떻게해야합니까?

도움 주셔서 감사합니다.

답변

2

이렇게하는 좋은 방법은 UIImageView의 CustomImageView 하위 클래스를 만드는 것입니다. UIPanGestureRecognizer를 CustomImageView의 각 인스턴스에 첨부하고 해당 인스턴스를 대상으로 설정합니다.

buttonClicked

MyImageView* imageview = [[MyImageView alloc] initWithFrame:CGRectMake(100, 0, 300, 22)]; 
    UIPanGestureRecognizer *imageviewGesture = 
    [[UIPanGestureRecognizer alloc] initWithTarget:imageview 
              action:@selector(recognizePan:)]; 

에서 CustomImageView.m

- (void)recognizePan:(UIPanGestureRecognizer *)sender { 
     [self.layer removeAllAnimations]; 
     [self.superview bringSubviewToFront:self]; 
     CGPoint translatedPoint = [sender translationInView:self]; 
     if([sender state] == UIGestureRecognizerStateBegan) { 
      self.firstX = [self center].x; 
      self.firstY = [self center].y; 
     } 
     translatedPoint = CGPointMake(self.firstX + translatedPoint.x, 
             self.firstY + translatedPoint.y); 
     [self setCenter:translatedPoint]; 
    } 

업데이트에서 : 당신이 self로보기 참조 할 수 있도록 그런 제스처에 의해 트리거 동작 방법은 뷰 자체에 구현

똑바로 생각하지 않아도됩니다. 물론 할 수는 없습니다. 당신이하고있는 것처럼 viewController에서 그의 제스처 호출기 속성 인 view에 접근하여 귀하의 오류가 아니라 여기에 있습니다 : 당신은 UIPanGestureRecognizer에서 UITapGestureRecognizer에 보낸 사람의 유형을 변경하는

- (void)recognizePan:(UIPanGestureRecognizer *)sender { 
    [[[(UITapGestureRecognizer *)sender view] layer] removeAllAnimations]; 

. 실제로 당신은 그 메소드의 몸체에 타입 변환을 할 필요가 없습니다.

+0

감사합니다. 하지만 내 코드와 다른 점은 무엇입니까? –

+0

@TBlue, 당신 말이 맞아요, 나는 똑바로 생각하지 못했습니다 ...하지만 여전히 질문을 남겨두고 있습니다, 왜 당신은 일하지 않습니까? 내 작품, 그리고 기본적으로 너와 같은 일을하고있어 ... – foundry

+0

@ T 블루 - 내가 당신의 오류를 발견, 내 업데이 트를 참조하십시오 ... – foundry

관련 문제