我有一个附有UIPanGestureRecognizer的UIView,手势工作正常,除了起点不是平移首次启动的地方,它通常在x和y坐标中偏离5到15个像素。不幸的是方差不一致,似乎与平移运动的速度有关。
为了验证触摸是否正确发送,我已经向子视图添加了touchesBegan方法,并且它接收到正确的起始点,但是手势在其开始阶段没有提供相同的点。我的日志中的一些示例位于“线起点”下方,是从手势识别器接收到的第一个点。
touchesBegan got point 617.000000x505.000000
Line start point at 630.000000x504.0000001
touchesBegan got point 403.000000x503.000000
Line start point at 413.000000x504.000000
touchesBegan got point 323.000000x562.000000
Line start point at 341.000000x568.000000
之前有没有人见过这个问题?
关于如何解决这个问题而不必实现全新的UIGestureRecognizer的任何想法?
答案 0 :(得分:6)
您可以使用手势识别器的委托方法
检测手势的初始触摸位置- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
答案 1 :(得分:3)
CGPoint beg = [panRecognizer locationInView:_scrollView];
CGPoint trans = [panRecognizer translationInView:_scrollView];
CGPoint firstTouch = CGPointSubtract(beg, trans);
将此代码放入UIGestureRecognizerStateBegan案例
答案 2 :(得分:2)
documentation表示当手指“移动到足以被视为平底锅”时,平移手势开始。这个动作是为了区分按压和拖动,因为用户的手指在试图按下而不拖动时可能会移动一点。
我认为这是你在第一个接触点和第一个被认为是阻力部分的点之间看到的差异。
答案 3 :(得分:2)
是的,差异是因为手势识别器在变为活动之前等待未确定的移动距离。您可以做的是创建自己的UIPanGestureRecognizer并在touchesMoved覆盖方法中将状态设置为UIGestureRecognizerStateChanged。
注意:我使用touhcesMoved而不是touchesBegan,因为我希望它在用户触摸移动时启动,而不是立即启动。
以下是自定义手势识别器的一些示例代码:
#import "RAUIPanGestureRecognizer.h"
@implementation RAUIPanGestureRecognizer
#pragma mark - UIGestureRecognizerSubclass Methods
- (void)reset
{ [super reset ]; }
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
{ [super touchesBegan:touches withEvent:event ]; }
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
[self setState:UIGestureRecognizerStateChanged ];
[super touchesMoved:touches withEvent:event ];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{ [super touchesEnded:touches withEvent:event ]; }
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{ [super touchesCancelled:touches withEvent:event ]; }
@end
答案 4 :(得分:0)
要解决此问题,您可以尝试在手势识别器开始时重置转换点。例如,像这样开始你的动作方法:
- (void)panGesture:(UIPanGestureRecognizer *)recognizer;
{
if ( recognizer.state == UIGestureRecognizerStateBegan )
{
CGPoint point = ...; // The view's initial origin.
UIView *superview = [recognizer.view superview];
[recognizer setTranslation:point inView:superview];
}
}
答案 5 :(得分:0)
更改起点的原因如@道格拉斯所说:
识别出摇动手势后,将计算起点和平移。
我使用以下方式获取“真实”起点:
对于具有平移手势的视图,请重写-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
方法,并存储“真实”起点以供以后使用:
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[super touchesBegan:touches withEvent:event];
self.touchStartPoint = [[[touches allObjects] firstObject] locationInView:self];
}