2011-08-26 6 views
0

iPad 용 Kid 's Book App에서 작업 중입니다. UIImageView (JPEG)를 표시하기 위해 UIImageView를로드하는 UIView가 있습니다. 사용자가 이미지를 스 와이프하여 페이지를 탐색 할 수 있습니다. 모든 것이 제대로 작동합니다. 이제 일부 페이지에 PNG 파일을로드 할 다른 UIImageView를 추가하고 탭 제스처에서 애니메이션을 적용하려는 대화 형 작업을 추가하고 싶습니다. 아래 코드 조각이 있습니다 ...UIImageView 태그 및 제스처 문제

Tap viewDidLoad 내부의 UIView로 제스처. viewDidLoad는 loadPage와 loadPage를 호출합니다. PNG 파일을 포함하는 UIImageView (imageAnimation)을 프로그래밍 방식으로 추가하고 handleTap 루틴 내부의 태그를 기반으로 애니메이션을 재생할 수 있도록 태그를 할당합니다. 어떤 이유로, handleTap의 switch 문은 case 1에 대해서만 실행되고, 다른 경우에는 handleTap 루틴이 호출되지 않습니다. 내가 뭘 잘못 했니?

#import "KidsViewController.h" 

@implementation KidsViewController 
@synthesize imageAnimation; 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
    if ([touch.view isKindOfClass:[UISlider class]] || [touch.view isKindOfClass:[UIButton class]]) 
    { 
     return NO; 
    } 
    return YES; 
} 

- (void)handleTap:(UITapGestureRecognizer *)recognizer { 

    NSLog(@"KidsViewController ==> handleTap."); 

    switch (((UIGestureRecognizer *)recognizer).view.tag)  
    { 
     case 1: 
      //... 
      NSLog(@"KidsViewController ==> handleTap. Switch Case: %d", 1); 
      break; 
     case 2: 
      //... 
      NSLog(@"KidsViewController ==> handleTap. Switch Case: %d", 2); 
      break; 
     case 3: 
      //... 
      NSLog(@"KidsViewController ==> handleTap. Switch Case: %d", 3); 
      break;    
     default: 
      NSLog(@"KidsViewController ==> handleTap. Switch Case: DEFAULT"); 
      break; 
    } 

} 

- (void)viewDidLoad { 

    pageCount=12; 
    pageNum=1; 

    //put imageviews in place 
    imageNext.frame=CGRectMake(0,0-crop,screenwidth,screenheight+(crop*2)); 
    imageCurrent.frame=CGRectMake(0,0-crop,screenwidth,screenheight+(crop*2)); 

    [self loadPage]; 

    imageCurrent.image = [UIImage imageWithContentsOfFile:[self filePathForLanguage:language pageNumber:pageNum fileType:@"jpg"]]; 

    //TAP GESTURE 
    UITapGestureRecognizer *tapRecognizer; 
    tapRecognizer=[[UITapGestureRecognizer alloc] 
        initWithTarget:self 
        action:@selector(handleTap:)]; 
    tapRecognizer.numberOfTapsRequired=1; 
    tapRecognizer.numberOfTouchesRequired=1; 
    [self.imageAnimation addGestureRecognizer:tapRecognizer]; 
    tapRecognizer.delegate = self; 
    [tapRecognizer release]; 
} 

-(void)loadPage{ 

    imageNext.image = [UIImage imageWithContentsOfFile:[self filePathForLanguage:language pageNumber:pageNum fileType:@"jpg"]]; //[UIImage imageWithContentsOfFile:pathFilename]; 

    switch (pageNum)  
    { 
     case 1: 
      //... 
      NSLog(@"KidsViewController ==> loadPage. Switch Case: %d", pageNum); 
      UIImage *image = [UIImage imageNamed:@"P3-stilts_00000.png"]; 
      CGRect frame = CGRectMake(0, 0, image.size.width, image.size.height); 
      imageAnimation = [[UIImageView alloc] initWithFrame:frame]; 
      imageAnimation.userInteractionEnabled = YES; 
      imageAnimation.image = image; 
      imageAnimation.tag = pageNum; 
      [self.view addSubview:imageAnimation]; 
      [image release]; 
      break; 
     case 2: 
      //... 
      NSLog(@"KidsViewController ==> loadPage. Switch Case: %d", pageNum); 
      imageAnimation.image = nil; 
      [imageAnimation setCenter:CGPointMake(-100,-100)]; 
      break; 
     case 3: 
      //... 
      NSLog(@"KidsViewController ==> loadPage. Switch Case: %d", pageNum); 
      UIImage *image3 = [UIImage imageNamed:@"bug.png"]; 
      CGRect bugFrame = CGRectMake(0, 0, image3.size.width, image3.size.height); 
      imageAnimation = [[UIImageView alloc] initWithFrame:bugFrame]; 
      imageAnimation.userInteractionEnabled = YES; 
      imageAnimation.image = image3; 
      imageAnimation.tag = pageNum; 
      [self.view addSubview:imageAnimation]; 
      [image3 release]; 
      break;    
     default: 
      NSLog(@"KidsViewController ==> loadPage. Switch Case: DEFAULT"); 
      [imageAnimation setCenter:CGPointMake(-100,-100)]; 
      break; 
    } 
} 

- (void)dealloc { 
    [setupViewController release]; 
    [imageCurrent release]; 
    [imageNext release]; 
    [imageShadow release]; 
    [imageMenuBar release]; 
    [imageAnimation release]; 
    [super dealloc]; 
} 

@end 

답변

2

당신은 항상 당신의 self.view의 태그를 얻을. 태그은 기본적으로 입니다. 따라서 스위치는 기본값 인으로 점프됩니다.

imageAnimation에 인식기를 추가하면 정상적으로 작동합니다.

+0

제스처 인식 추가 이미지 뷰 (imageAnimation)로 이동하면 easist 라우트가 직접 들립니다. 스위치가 작동하고 tapRecognizer.view 사용 이외의 어디서 왔는지 파악할 필요가 없습니다. – Sam

+0

Thx Nekto & Sam, 제스처 인식기를 imageview (imageAnimation)에 직접 추가하려고 시도했습니다.이 경우 한 페이지에서만 작동하지만 다른 페이지에서는 작동하지 않습니다. 그게 내가 풀어주지 않고 다시 제대로 추가하지 않기 때문일 수 있니? imageAnimation을 다른 PNG로 다시 사용하고 여러 페이지에서 다른 애니메이션을 처리하려고합니다. – Alex

+0

각 ** imageAnimation.tag **에 대해 각 페이지마다 고유 한 태그를 할당 했습니까? 그렇다면 업데이트 된 버전의 코드를 게시 할 수 있습니까? 아니면, 우리에게 더 많은 세부 사항을주십시오. – Nekto

1

의 문제가이있을 수 있습니다 : 당신이 경우

[self.view addGestureRecognizer:tapRecognizer]; 

:

switch (((UIGestureRecognizer *)recognizer).view.tag) 

후 당신이 당신이 이미지 뷰보기 컨트롤러의보기로하지에 추가되는 제스처 인식기를 등록 할 때 도청 된 뷰를 얻으려고 시도 할 때 같은 것을 사용하는 것을 고려하십시오.

CGPoint point = [tapRecognizer locationInView:tapRecognizer.view]; 
UIView *viewThatWasTouched = [tapRecognizer.view hitTest:point withEvent:nil];