我可以'刷新'UIGestureRecognizer事件吗?

时间:2013-10-31 21:08:25

标签: ios7 uigesturerecognizer

在iOS 7中,Apple似乎改变了手势识别器的行为方式。以UIPinchGestureRecognizer为例。如果我在UIGestureRecognizerStateChanged中执行缓慢的重绘操作,这在旧版本的iOS下可以正常工作,但在较新版本中,我的重绘通常不会在使用另一个StateChanged更新再次调用捏合手势之前呈现到屏幕上,并且再次调用慢速绘制操作。在系统通过我对视图的更改实际更新屏幕的可见部分之前,这种情况会反复多次发生。

我发现一个解决方案就是打电话:

[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: [NSDate date]];

每当我收到UIGestureRecognizerStateChanged事件时。这样,每次完成时,绘图都会在屏幕上呈现。但是仍然存在一个“事件滞后”的问题,其中一系列捏合事件排队等待,这样即使在我停止捏住屏幕之后,图像也会在尺寸上保持缩放。

我的问题是,是否有办法“刷新”排队的夹点事件,所以每当我得到一个UIGestureRecognizerStateChanged事件时,我可以进行慢速绘图操作,然后刷新所有其他夹点事件,所以只有最新的一个得到处理。任何人都知道这是否可行?我想我可以构建一个查看UIGestureRecognizerStateChanged事件时间的系统,并抛出与最近重绘相近的事件,但这似乎是一个黑客攻击。

- (void) handleGlobalPinchGesture:(UIPinchGestureRecognizer*)_pinchGesture
{
    if (  _pinchGesture.state == UIGestureRecognizerStateBegan )
    {
       // stuff
    return;
    }

    if ( _pinchGesture.state == UIGestureRecognizerStateEnded || _pinchGesture.state == UIGestureRecognizerStateCancelled )
    {
       // end stuff
        return;
    }

    if (_pinchGesture.state == UIGestureRecognizerStateChanged )
    {
    doSlowRedrawingOperationHere();
    }
}

2 个答案:

答案 0 :(得分:1)

我不认为,这是手势识别器的问题,我在移动转换后的视图方面遇到了同样的问题。我已经解决了它,通过添加查看drawRect方法,并在更改视图中心之前调用 - (void)setNeedsDisplay方法: 在视图中:

- (void)drawRect:(CGRect)rect
{
    [super drawRect:rect];
}

在手势识别器的动作中:

[CATransaction begin];
[CATransaction setValue:@(YES) forKey:kCATransactionDisableActions];

_destinationIndicatorView.center = center;
[self.frameView setNeedsDisplay];
self.frameView.center = center;

[CATransaction commit];

它对我有用。

答案 1 :(得分:0)

我从来没有找到一种方法来冲洗'这些事件,但我找到了一个' hack'确保每个渲染都反映在屏幕上,因此用户可以实时查看您的手势动作,即使这些重绘操作很慢。我的解决方案是致电:

[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: [NSDate date]];

给予操作系统时间'在屏幕上重绘。我是在我的手势识别器回调中执行此操作,并且仅在iOS 7或更高版本上运行时才会执行此操作。

上述调用必须添加到所有手势识别器的回调中(在呈现新内容之后)。希望这有助于某人!

太糟糕了,这个' hack'如果你想要一个良好的用户体验,当你的慢速渲染作为对手势的直接反应时,iOS 7中似乎是必需的。