在 iOS7 上的应该开始和处理程序(状态开始)之间重置平移手势翻译
Posted
技术标签:
【中文标题】在 iOS7 上的应该开始和处理程序(状态开始)之间重置平移手势翻译【英文标题】:Pan gesture translation being reset between should-begin and handler (with state began) on iOS7 【发布时间】:2013-09-22 17:25:57 【问题描述】:我有一个平移手势识别器来向上、向下、向左或向右拖动面板。当平移的方向不可能时,我不允许识别器开始,以便触摸可以转到面板中的其他 UI 元素。
但是,在 ios7 上,翻译有时会在 gestureRecognizerShouldBegin:
和我的手势处理程序 handlePan:
之间重置
- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer*)panGR
CGPoint trans = [panGR translationInView:self.view];
NSLog(@"should begin trans: (%.2f, %.2f)", trans.x, trans.y);
...
此日志:should begin trans: (18.00, 0.00)
- (void)handlePan:(UIPanGestureRecognizer*)panGR
CGPoint trans = [panGR translationInView:self.view];
switch(panGR.state)
case UIGestureRecognizerStateBegan:
NSLog(@"handlePan began trans: (%.2f, %.2f)", trans.x, trans.y);
...
此日志:handlePan began trans: (0.00, 0.00)
这意味着确定平移方向的共享代码(在这种情况下为右)在gestureRecognizerShouldBegin:
中工作并允许手势开始,但当state
时无法在handlePan:
中确定是UIGestureRecognizerStateBegan
。
这是 iOS7 中的错误还是故意改变行为以适应新的手势类型?另外,任何人都可以提出解决此问题的好方法吗?
【问题讨论】:
【参考方案1】:UIPanGestureRecognizer
在达到UIGestureRecognizerStateBegan
状态后总是将转换设置为 (0,0) - 因为即使是最轻微的转换也会被识别为仅用作触发器(如果您为开始设置了较大的阈值像 (50,50) 这样的识别你显然会在 UI 行为中得到一个“滞后”——作为一种解决方法,我建议存储翻译的值,然后使用 UIView 动画更平滑地平移对象)。您应该使用UIGestureRecognizerStateChanged
来更新翻译,并使用UIGestureRecognizerStateRecognized
来设置平移的终点。
【讨论】:
我认为您误解了这个问题。此转换重置发生在gestureRecognizerShouldBegin
和状态为UIGestureRecognizerStateBegan
的处理程序之间。我认为这是iOS7中的一个错误
我写“在到达UIGestureRecognizerStateBegan
之后”的意思是,这种重置发生在调用处理程序之前,不是吗?我理解这个问题并运行了一些代码来重现它 - 我同意你的观点,这种行为非常令人困惑,在某些情况下可能会导致麻烦,例如在gestureRecognizerShouldBegin
的实现仅在相对较大(即屏幕上可以看到的距离,例如(18.00, 0.00)
)发生转换时才返回YES
的情况。我的理解是这样的?【参考方案2】:
您可以通过检查水平平移是高于还是低于 0 来确定@987654321@ 中的方向。但是在handlePan:
结束时,您确实需要将平移的CGPoint
重置为新的参考下一个翻译。
- (void)handlePan:(UIPanGestureRecognizer*)panGR
CGPoint translation = [gr translationInView:self.view];
if (translation.x > 0)
//Direction: Right
else if (translation.x < 0)
//Direction: Left
[gr setTranslation:CGPointZero
inView:self.view];
【讨论】:
以上是关于在 iOS7 上的应该开始和处理程序(状态开始)之间重置平移手势翻译的主要内容,如果未能解决你的问题,请参考以下文章
带有iOS7的iphone上的UIDocumentInteractionController奇怪的行为
Formik:useField 钩子上的 onBlur 处理程序