在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();
}
}
答案 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中似乎是必需的。