ios - 如何拖动 UIImageView?

标签 ios objective-c uiimageview drag touches

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

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

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

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

最佳答案

我在一个小项目中尝试使用更方便的 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
  • 平移手势的委托(delegate)连接到 View ,操作连接到“平移”方法
  • dragimg 的gestureRecognizer 然后连接到Pan Gesture Recognizer(之前通过拖拽添加到viewcontroller)

  • enter image description here
  • 如果您扩展距离计算并正确修改排序,则可以添加更多点
  • 关于ios - 如何拖动 UIImageView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16639441/

    相关文章:

    ios - PayPal Mobile SDK授权问题

    ios - 如何阅读此 iOS 堆栈跟踪?

    ios - 如何使用模拟器在 XCUITest 中以编程方式清除 NSUserDefaults

    xcode - 如何在 ImageView 中转换 PFObject 数组?

    ios - UIImage View -动画 View 逻辑错误xCode 4.2

    ios - 从结构中删除重复项

    iphone - iOS:为什么不显示来自 HTTP Post 的 responseData

    objective-c - NSDictionary 中的 NSDictionary

    ios - 如何更改#define值

    ios - 线程 1 : signal SIGABRT Xcode 5. 1