2011-08-26 15 views
0

iPad用のKid's Book Appで作業しています。 UIImageViewをロードしてUIImages(JPEG)を表示するUIViewがあり、ユーザーが画像をスワイプしてページをブラウズできるようになりました。今度は、いくつかのページにいくつかのインタラクティブ機能を追加したいのですが、別のUIImageViewを追加してPNGファイルをロードし、Tapジェスチャーでアニメーションを作成したいと思います...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)へのrは、行くためにeasistルートを直接聞きます。スイッチが機能し、どこから来たのか把握する必要はありません(tapRecognizer.viewの使用以外)。 – Sam

+0

Thx Nekto&Sam、画像ビュー(imageAnimation)に直接ジェスチャ認識機能を追加しようとしましたが、その場合は1ページだけで動作しますが、他のページでは機能しません。それは私が解放したり、正しく追加したりしていないからでしょうか? imageAnimationをさまざまなPNGで再利用し、多くのページでさまざまなアニメーションを処理したいと考えています。 – Alex

+0

各ページ(**各imageAnimation.tag **)に一意のタグを割り当てましたか?はいの場合は、コードの更新版を投稿できますか?または、詳細を教えてください。 – Nekto

1

あなたの問題はここにあるかもしれない:あなたがいる場合

[self.view addGestureRecognizer:tapRecognizer]; 

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

後、あなたはあなたがあなたがImageViewのあなたのビューコントローラのビューにしていないに追加することジェスチャー認識を登録するとタップされたビューを取得しようとすると、何かを使うことを検討してください。

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