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);
给出错误的效果。 有人知道为什么?
一些想法:
-
我build议在做任何改变
center
之前确保你捕捉到startLocation
。 -
您正在将用户触摸的位置用于
startLocation
。 你真的应该初始化这与recognizer.view
。视图的center
。 用户非常不可能在button的中心精确地开始姿势。 结果,你不可能在原来的位置回来。
有点不相干,但是:
-
重置
UIGestureRecognizerStateEnded
子句中的CGMakePoint
的center
时,不需要使用CGMakePoint
。 如果你真的想要,可以使用CGPointMake
,但这是不必要的。 如果你愿意,你可以使用startLocation
。 -
您可能想要将视图的返回animation化回到
startLocation
。 它是立即去那里的震动。 -
另外,如果您保存了
startLocation
,则不需要不断重置translation
。 只需使用startLocation
和translation
。 似乎更清楚,但显然这是主观的。 -
我个人认为在logging
CGPoint
结构时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];