我在一个小项目中尝试使用更方便的 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 个 UIImageView。其中 3 个是静态的(spot1,2 和“home”点背景半色调圆圈),加上“home”点内的可拖动黄色圆圈。我还添加了一个平移手势识别器。然后我设置网点:
- uiimageviews 连接到 spot1、spot2、bkgr 和 dragimg
- 平移手势的委托连接到视图,操作连接到“平移”方法
- dragimg 的 gestureRecognizer 然后连接到 Pan Gesture Recognizer(之前通过拖动添加到 viewcontroller)
- 如果您扩展距离计算并正确修改排序,您可以添加更多点