在 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 处理程序

重叠视图iOS7上的状态栏

无法保存到 iOS 7.0.2 上的 NSUserDefaults

strcpy 在 ios7 上的行为不同

错误的iOS8状态栏?