2

这是我的情况:我有 3 个 UIImageViews。其中两个将充当反应器(第三个将被拖到的反应器)。如前所述,第三个将可拖动到前面提到的两个 UIImageView 之一。

我目前正在使用 touchesBegan、touchesMoved 和 touchesEnded 来完成此操作,但存在一个问题。

将可拖动的 UIImageView 拖到两个 UIImageView 之一后,我希望可拖动的图像视图缓慢(动画)恢复到原始位置(底部中心)。

我怎么能做到这一点?提前致谢!

4

2 回答 2

1

我在一个小项目中尝试使用更方便的 UIPanGestureRecognizer 进行拖动捕捉。希望它可以解决您的问题,如果您需要更多信息,请发表评论(您可以从https://github.com/codedad/SO_Drag_n_Snap_iOS下载 GitHub 项目)。

我的 ViewController.h:

@interface ViewController : UIViewController <UIGestureRecognizerDelegate> {
    CGPoint firstPos;
}

@property IBOutlet UIImageView *spot1;
@property IBOutlet UIImageView *spot2;
@property IBOutlet UIImageView *bkgr;
@property IBOutlet UIImageView *dragimg;

- (float) distanceSquared:(CGPoint) p1 p2:(CGPoint) p2;
- (IBAction)pan:(UIPanGestureRecognizer *)gesture;

我的 ViewController.m:

- (float) distanceSquared:(CGPoint) p1 p2:(CGPoint) p2 {
    float dx = (p1.x-p2.x);
    float dy = (p1.y-p2.y);
    return dx*dx+dy*dy;
}

void sort(int*a,int n,int*ndx) {
    int*b,*c,t;
    int*bi,*ci,ti;
    for(b=a+n,bi=ndx+n ; --b>a;) {
        --bi;
        for(c=b,ci=bi;--c>=a;) {
            --ci;
            if(*c>*b)t=*b,*b=*c,*c=t,ti=*bi,*bi=*ci,*ci=ti;
        }
    }
}

- (IBAction)pan:(UIPanGestureRecognizer *)gesture {
    CGPoint translatedPoint = [gesture translationInView:self.view];

    if ([gesture state] == UIGestureRecognizerStateBegan) {
        firstPos = [[gesture view] center];
    }

    translatedPoint = CGPointMake(firstPos.x+translatedPoint.x, firstPos.y+translatedPoint.y);
    [[gesture view] setCenter:translatedPoint];

    if ([gesture state] == UIGestureRecognizerStateEnded) {
        CGPoint snapPos;
        int distances[3];
        distances[0] = [self distanceSquared:dragimg.center p2:spot1.center];
        distances[1] = [self distanceSquared:dragimg.center p2:spot2.center];
        distances[2] = [self distanceSquared:dragimg.center p2:bkgr.center];
        int distances_ndx[3] = {0,1,2};
        sort(distances, 3, distances_ndx);

        switch (distances_ndx[0]) {
            case 0:
                snapPos = spot1.center;
                break;
            case 1:
                snapPos = spot2.center;
                break;
            default:
                snapPos = bkgr.center;
                break;
        }
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:0.2];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
        [UIView setAnimationDelegate:self];
        dragimg.center = snapPos;
        [UIView commitAnimations];
    }
}

我的 ViewController.xib:

我包括了 4 个 UIImageViews。其中 3 个是静态的(spot1,2 和“home”点背景半色调圆圈),加上“home”点内的可拖动黄色圆圈。我还添加了一个平移手势识别器。然后我设置网点:

  • uiimageviews 连接到 spot1、spot2、bkgr 和 dragimg
  • 平移手势的委托连接到视图,操作连接到“平移”方法
  • 然后dragimg的gestureRecognizer连接到Pan Gesture Recognizer(之前通过拖拽添加到viewcontroller)

在此处输入图像描述

  • 如果您扩展距离计算并正确修改排序,您可以添加更多点
于 2013-05-20T22:18:57.957 回答
-1
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{


UITouch *touch = [[event allTouches]anyObject];
if([touch view] == First_imageview)
{
}

UITouch *touch1 = [[event allTouches]anyObject];
if([touch1 view] == 2_imageview)
{
}

UITouch *touch2 = [[event allTouches]anyObject];
if([touch2 view] == 3_imageview)
{
}

}





    - (void) touchesMoved:(NSSet *)touches withEvent: (UIEvent *)event
 {

    UITouch *touch = [[event allTouches]anyObject];
    if([touch view] == First_imageview)
    {
    }

    UITouch *touch1 = [[event allTouches]anyObject];
    if([touch1 view] == 2_imageview)
    {
    }

    UITouch *touch2 = [[event allTouches]anyObject];
    if([touch2 view] == 3_imageview)
    {
    }
  }

使用这两种方法并简单地拖动您的三个图像视图。我希望这段代码对你有用。

于 2013-05-20T05:21:04.883 回答