1

タップしたジェスチャーで画像を選択するにはどうすればよいですか。タップしたのと同じ画像を追加したい。3つの画像があり、2つ目の画像をタップした場合、2つ目の画像と同じ4つ目の画像が動的に追加されます。

UIImage *image = [[info objectForKey:@"UIImagePickerControllerOriginalImage"] retain];

    UIView *holderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, image.size.width/4, image.size.height/4)];
    UIImageView *imageview = [[UIImageView alloc] initWithFrame:[holderView frame]];


UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)];
    [tapRecognizer setNumberOfTapsRequired:1];
    [tapRecognizer setDelegate:self];
    [holderView addGestureRecognizer:tapRecognizer];

-(void)tapped:(id)sender {

    [[[(UITapGestureRecognizer*)sender view] layer] removeAllAnimations];
    NSLog(@"Tapped");
    [self.view bringSubviewToFront:[(UITapGestureRecognizer*)sender view]];
    UIImageView *image = (UIImageView *)[(UITapGestureRecognizer*)sender view];
    [self.view addSubview:image];
}

私は[(UITapGestureRecognizer*)sender view]]そのビューを取得するために使用しています。しかし、私はできません。そして、タップすると、タップした画像を追加したいと思います。

4

3 に答える 3

5

問題は、タップされたメソッドにあります。書く(UIImageView *)[(UITapGestureRecognizer*)sender view];と同じimageViewものが追加され、フレームは追加されたときと同じになります。次に、を使用して追加addSubviewします。そうすると、前に追加したのと同じ位置に追加されます。

あなたのように変更するだけtappedです:

-(void)tapped:(id)sender
{
  [[[(UITapGestureRecognizer*)sender view] layer] removeAllAnimations];
  UIImageView *imgView = (UIImageView *)[(UITapGestureRecognizer*)sender view];
  UIImageView *imageview = [[UIImageView alloc] initWithFrame:yourFrame]; //Set the next frame for the image view
  imageView.image = imgView.image;
  [self.view addSubview:imageView];
  [imageView release];
  imageView = nil;
}

また、次のようにジェスチャーをUIImageViewに追加します。

[imageview addGestureRecognizer:tapRecognizer];UIViewではありません。

また設定imageview.userInteractionEnabled = YES;

于 2012-11-19T11:36:48.360 に答える
1

3つの問題:

  1. Jon Roseが指摘したようにUIImageView、同じものを保持する新しいものが必要です。UIImage
  2. UIImageViewMidhun MPが指摘したように、新しいフレームを設定する必要があります。
  3. どちらもジェスチャ認識ロジックを見逃していますが、これもあなたの場合は壊れています。ジェスチャレコグナイザは、一度に1つのビューにのみ追加できます。

3を解決するには、(a)それぞれUIImageViewに1つの認識機能が必要です。または、(b)含まれているビューに対して1つの認識機能を使用します。これはselfあなたの場合です。

(a)の場合、実際UIImageViewにジェスチャ処理をサブクラス化して実装する必要があります。(b)の場合、サブビューに認識機能を追加selftapped:、サブビューをループして、次の方法でタップされたものを見つけます。

for(UIView* subject in self.subviews)
{
    CGPoint pointInSubjectsView = [recognizer locationInView:subject];
    BOOL pointInsideObject = [subject pointInside:pointInSubjectsView withEvent:nil];
    if(pointInsideObject){
        //subject is the tapped view. do the work...
    }
}

あなたのコードは、タップでキャンセルしたいアニメーションを実行していて、画像が重なっている可能性があり、タップした画像を前面に表示したいことを示唆していますか?この場合、おそらく(a)を使用する必要があります。

幸運を。

于 2012-11-19T17:09:54.113 に答える
1

とを混同しているようUIImageですUIImageView。AUImageViewは一種でUIViewあり、1つ(そして1つだけ)のスーパービューを持つことができます。それがどの画像を保持しているかを知りたい場合は、'image'プロパティを使用できます。次に、タップしたものUIImageViewと同じもので新しいものを作成できます。UIImageアプリケーションによっては、フレームのサイズを変更して設定する必要がある場合がありますcontentMode

いずれにせよ、tapイベントがまったく登録されていない場合はUIImageView、デフォルトである可能性が高いため、コードまたはXIBファイルのいずれかにuserInteractionEnabled=NO明示的に設定する必要があります。YES

于 2012-11-19T11:01:39.333 に答える