0

この動作をテストしようとしているサンプル プロジェクトがあります。2 つの UIImageView が並んでいます。左または右のUIImageViewのいずれかでlongPressを実行し、半透明のクローン画像を作成し、それを他のUIImageViewにドラッグして画像を交換できるようにしたいと考えています。

たとえば、画像を入れ替えるには、次のようにします。

  1. 左側の UIImageView を長押しします
  2. 複製された小さな「ゴースト」画像がタッチ座標に表示されます
  3. ユーザーは複製された画像を右の UIImageView にドラッグします
  4. ユーザーは画面から指を離して、複製された画像を「ドロップ」します。
  5. 左右の UIImageViews は、画像を圧倒することができます。

説明するためのいくつかの写真を次に示します。

元の状態:

http://d.pr/i/PNVc

左側の UIImageView を長押しすると、小さなクローン イメージがサブビューとして追加されます。

http://d.pr/i/jwxj

長押しを検出してクローン画像を作成できますが、指を離して画面にもう一度タッチしない限り、その画像をパンすることはできません。

ユーザーが画面から指を離さなくても、すべてを 1 つの動作で実行できるようにしたいと考えています。

これが正しい方法かどうかはわかりませんが、これが今のところ私がやっている方法です。助けてくれてありがとう!

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    [self addLongPressGestureToPiece:leftImageView];
    [self addLongPressGestureToPiece:rightImageView];
}

- (void)addLongPressGestureToPiece:(UIView *)piece
{
    NSLog(@"addLongPressGestureToPiece");
    UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressPiece:)];
    [longPressGesture setDelegate:self];
    [piece addGestureRecognizer:longPressGesture];
    [longPressGesture release];
}

- (void)addPanGestureRecognizerToPiece:(UIView *)piece
{
    NSLog(@"addPanGestureRecognizerToPiece");
    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panPiece:)];
    [panGesture setMaximumNumberOfTouches:1];
    [panGesture setDelegate:self];
    [piece addGestureRecognizer:panGesture];
    [panGesture release];
}

- (void)longPressPiece:(UILongPressGestureRecognizer *)gestureRecognizer
{
    UIImageView *piece = (UIImageView*)[gestureRecognizer view];

    CGPoint point = [gestureRecognizer locationInView:self.view];

    if(gestureRecognizer.state == UIGestureRecognizerStateBegan)
    {
        NSLog(@"UIGestureRecognizerStateBegan");

        // create the semi-transparent imageview with the selected pic

        UIImage *longPressImage = [piece image];
        UIImageView *draggableImageView = [[UIImageView alloc] initWithFrame:CGRectMake(point.x - longPressImage.size.width/6/2, point.y - longPressImage.size.height/6/2, longPressImage.size.width/6, longPressImage.size.height/6)];
        draggableImageView.image = longPressImage;
        draggableImageView.alpha = 0.5;
        draggableImageView.userInteractionEnabled = YES;
        [self.view addSubview:draggableImageView];

        [self addPanGestureRecognizerToPiece:draggableImageView];
        photoView.userInteractionEnabled = NO;
    }
    else if(gestureRecognizer.state == UIGestureRecognizerStateChanged)
    {
        NSLog(@"Changed");
    }
    else if(gestureRecognizer.state == UIGestureRecognizerStateEnded)
    {
        NSLog(@"Ended");
        photoView.userInteractionEnabled = YES;
    }

}


- (void)adjustAnchorPointForGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
{
    NSLog(@"adjustAnchorPointForGestureRecognizer");
    if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
        UIView *piece = gestureRecognizer.view;
        CGPoint locationInView = [gestureRecognizer locationInView:piece];
        CGPoint locationInSuperview = [gestureRecognizer locationInView:piece.superview];
        piece.layer.anchorPoint = CGPointMake(locationInView.x / piece.bounds.size.width, locationInView.y / piece.bounds.size.height);
        piece.center = locationInSuperview;
    }
}

- (void)panPiece:(UIPanGestureRecognizer *)gestureRecognizer
{
    NSLog(@"pan piece");
    UIView *piece =[gestureRecognizer view];

    [self adjustAnchorPointForGestureRecognizer:gestureRecognizer];

    CGPoint translation = [gestureRecognizer translationInView:[piece superview]];

    // if velocity.y is positive, user is moving down, if negative, then moving up
    CGPoint velocity = [gestureRecognizer velocityInView:[piece superview]];

    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged)
    {
        [piece setCenter:CGPointMake([piece center].x + translation.x, [piece center].y + translation.y)];

        [gestureRecognizer setTranslation:CGPointZero inView:[piece superview]];
    }
    else if([gestureRecognizer state] == UIGestureRecognizerStateEnded)
    {
        NSLog(@"piece y %f", piece.frame.origin.y);

    }
}
4

2 に答える 2

0

これはおそらく、画像 (およびジェスチャ レコグナイザー) が作成される前に、タッチが既に検出されていたためです。事前にゴースト イメージを作成することをお勧めしますが、それらは非表示にします。そうすれば、ゴースト画像が既に存在するため、ジェスチャ認識エンジンが実際に起動されます。

ただし、画像がたくさんある場合、これは高価になる可能性があります。パフォーマンスが悪い場合は、画像ビューを作成することも検討できますが、それらのビューがタッチされたときにのみ画像を設定します。そうすれば、イメージを不必要にメモリにロードする必要がなくなります。

于 2012-08-30T03:45:00.680 に答える