iOS:错误的效果与“Recognizer.view.center = CGPointMake(…”

我使用locationInView设置我的bouton当用户释放它的位置。 发布之后,我给出之前存储的位置,但事实上,我的button不会返回到正确的位置。

这我的代码:

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer{ CGPoint translation = [recognizer translationInView:self.view]; recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, recognizer.view.center.y + translation.y); [recognizer setTranslation:CGPointMake(0, 0) inView:self.view]; static CGPoint startLocation; if (recognizer.state == UIGestureRecognizerStateBegan) { startLocation = [recognizer locationInView:self.view]; NSLog(@"Began: %d" @"-" @"%d", (int)startLocation.x , (int)startLocation.y); } if (recognizer.state == UIGestureRecognizerStateEnded) { NSLog(@"Ended Bef: %d" @"-" @"%d", (int)startLocation.x, (int)startLocation.y); recognizer.view.center = CGPointMake(startLocation.x, startLocation.y); startLocation = [recognizer locationInView:self.view]; NSLog(@"Ended Aft: %d" @"-" @"%d", (int)startLocation.x, (int)startLocation.y); } } 

实际上,指令是:

 recognizer.view.center = CGPointMake(startLocation.x, startLocation.y); 

给出错误的效果。 有人知道为什么?

一些想法:

  1. 我build议在做任何改变center之前确保你捕捉到startLocation

  2. 您正在将用户触摸的位置用于startLocation 。 你真的应该初始化这与recognizer.view 。视图的center 。 用户非常不可能在button的中心精确地开始姿势。 结果,你不可能在原来的位置回来。

有点不相干,但是:

  1. 重置UIGestureRecognizerStateEnded子句中的CGMakePointcenter时,不需要使用CGMakePoint 。 如果你真的想要,可以使用CGPointMake ,但这是不必要的。 如果你愿意,你可以使用startLocation

  2. 您可能想要将视图的返回animation化回到startLocation 。 它是立即去那里的震动。

  3. 另外,如果您保存了startLocation ,则不需要不断重置translation 。 只需使用startLocationtranslation 。 似乎更清楚,但显然这是主观的。

  4. 我个人认为在loggingCGPoint结构时NSStringFromCGPoint非常有用。

所以,我会build议:

 - (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer { static CGPoint startLocation; if (recognizer.state == UIGestureRecognizerStateBegan) { startLocation = recognizer.view.center; NSLog(@"Began: %@", NSStringFromCGPoint(startLocation)); } CGPoint translation = [recognizer translationInView:self.view]; recognizer.view.center = CGPointMake(startLocation.x + translation.x, startLocation.y + translation.y); if (recognizer.state == UIGestureRecognizerStateEnded) { NSLog(@"Ended Bef: %@", NSStringFromCGPoint(startLocation)); [UIView animateWithDuration:0.25 animations:^{ recognizer.view.center = startLocation; }]; CGPoint finalLocation = [recognizer locationInView:self.view]; NSLog(@"Ended Aft: %@", NSStringFromCGPoint(finalLocation)); } } 

我想你应该尝试使用

 startLocation = [recognizer locationOfTouch:0 inView:self.view]; 

代替

 startLocation = [recognizer locationInView:self.view];