1

我有一个视图(它是在滚动视图中放大的视图),当用户捏合或双击以进行缩放时,我试图仅在 x 方向上拉伸。该视图不断被绘制:每秒最多 10 次,使用 Core Graphics 绘制图形。

所以我像这样覆盖 setTransform :

- (void)setTransform:(CGAffineTransform)newValue;
{
    CGAffineTransform constrainedTransform = CGAffineTransformIdentity;
    constrainedTransform.a = newValue.a;
    [super setTransform:constrainedTransform];
}

这通常会给我我想要的行为,除了一个大问题。当视图经常被绘制并且用户双击放大时,整个视图通常会变黑。如果我不覆盖上述方法,这种情况很少发生(尽管它仍然偶尔会发生一次)。同样有趣的是,当用户使用捏合手势进行缩放时,这不会发生。这是双击触发的功能:

- (void)handleDoubleTap:(UIGestureRecognizer *)gestureRecognizer 
{
    CGRect frame = [[self tiledScrollView] frame];
    float newScale = [[self tiledScrollView] zoomScale] * kZoomStep;
    CGRect zoomRect = [self zoomRectForFrame:frame withScale:newScale withCenter:[gestureRecognizer locationInView:[[self tiledScrollView] tileContainerView]]];
    [[self tiledScrollView] zoomToRect:zoomRect animated:YES];
}

并且捏合手势仅由 UIScrollView 的库存捏合识别器处理。关于上述函数的一件令我困扰的事情是 zoomRect 在 x 和 y 方向上都缩放,即使我的视图只在一个方向上缩放。我曾尝试仅在 x 方向上缩放 zoomRect,然后调用 zoomToRect,但随后图形不会缩放。

因此,似乎 UIScrollView 的捏合识别器和我的双击识别器以两种不同的方式缩放视图,并且只有捏合识别器的方式适用于我的代码......此外,当绘制速度变慢时,这个问题变得非常罕见,而当没有绘图正在进行。我尝试过使用队列来进行连续的绘图和缩放,但我没有太多运气。我怀疑 zoomToRect 和其他缩放方法可能会将任务分派给其他线程或其他任何东西,所以我认为它们不能以这种方式顺序化。但这是我应该研究更多的事情吗?

任何帮助将不胜感激。我已经浪费了几天时间试图解决这个问题 -_- 谢谢

4

0 回答 0