iOS:“recognizer.view.center = CGPointMake(...”的错误效果
Posted
技术标签:
【中文标题】iOS:“recognizer.view.center = CGPointMake(...”的错误效果【英文标题】:iOS: Wrong effect with "recognizer.view.center = CGPointMake(..." 【发布时间】:2013-04-17 12:31:40 【问题描述】:当用户释放按钮时,我使用 locationInView 来设置按钮的位置。释放后,我给出了之前存储的位置,但实际上,我的按钮并没有回到正确的位置。
这是我的代码:
- (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);
给出错误的效果。有人知道为什么吗?
【问题讨论】:
我已经更新了代码。谢谢。 当用户拖动按钮时,我存储按钮的初始位置,当用户在屏幕的任意位置释放按钮时,我想将按钮设置回起始位置。 谢谢。static
的缺失让我很困惑。
为什么是罗布?在这种情况下使用静态是一个糟糕的选择吗?
不,在您原来的问题中,您省略了static
。因此,我看不出该值是如何为您保存的。有了static
,这一切都变得有意义了。
【参考方案1】:
一些想法:
我建议在对 center
进行任何更改之前确保捕获 startLocation
。
您将用户触摸的位置用于startLocation
。你真的应该用recognizer.view
的center
来初始化它。用户不太可能在按钮的中心精确地开始他们的手势。因此,您不太可能回到原来的位置。
有点不相关,但是:
在UIGestureRecognizerStateEnded
子句中重置recognizer.view
的center
时不需要使用CGMakePoint
。如果你真的想要,你可以使用CGPointMake
,但这不是必需的。如果需要,您可以使用startLocation
。
您可能希望将视图返回到 startLocation
的动画。让它立即去那里是不和谐的。
顺便说一句,如果您保存了startLocation
,则无需不断重置translation
。只需使用startLocation
加上translation
。对我来说似乎更清楚,但显然这是主观的。
我个人认为NSStringFromCGPoint
在记录CGPoint
结构时非常有用。
所以,我建议:
- (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));
【讨论】:
哇啊啊啊,你真是个天才!!!!!!!!!许多thx,此外还有所有解释!再次感谢 Rob! 我真的需要进一步练习才能了解框架的强大!非常感谢!以上是关于iOS:“recognizer.view.center = CGPointMake(...”的错误效果的主要内容,如果未能解决你的问题,请参考以下文章