5

我正在使用缩放 UIScrollView 在我的 iPad 应用程序中显示图像。缩放效果很好,捏合使图像适当变小或变大。我还bouncesZoom启用了它,如果用户以一种或另一种方式将其拉伸得太远,它会反弹回最小或最大缩放。

现在,我想识别何时收缩结束,图像比最小缩放尺寸小 10%,在这种情况下,防止反弹发生并触发不同的动画来缩小图像以“关闭”它。这样,可以有一种“捏合”手势。我想出的最简单的方法是:

- (void)scrollViewDidZoom:(UIScrollView *)scrollView {
    if (self.zoomBouncing && zoomedToScale / self.minimumZoomScale < 0.90) {
        // We've let go and were under 90% of the minimum size.
        self.minimumZoomScale = zoomedToScale;
        [self shrinkImageToNothing];
    } else {
        // How far have we gone?
        zoomedToScale = self.zoomScale;
    }
}

这很好用,只是此时它已经在弹跳,所以设置minimumZoomScale没有任何作用。因此,反弹和收缩同时发生,正如您可能想象的那样,这看起来很奇怪。

所以我的问题是:如何防止反弹仅在这种特定情况下发生?没有 UIScrollViewDelegate 方法允许我的代码在手势完成和 UIScrollView 决定反弹之间执行某些操作。我尝试了很多其他技术,但都没有运气,包括:

  • nil–viewForZoomingInScrollView:我的 90% 缩放阈值通过后返回。不起作用,因为在手势开始时调用此方法,而不是针对缩放的每个点。
  • 缩放系数小于 90% 时设置bouncesZoom为false,大于或等于 90% 时设置为 true。-scrollViewDidZoom:当比例低于 90% 时使图像严重抖动,因为当bouncesZoom为假时它不允许该尺寸。
  • 添加-touchesEnded:withEvent方法。它永远不会被调用。
  • 添加我自己的 UIPinchGestureRecognizer 以与 UIScrollView 自己的捏识别器同时执行。不起作用,因为它的处理程序(和委托方法)是在 UIScrollView 的捏合手势之后调用的,这使得决定在我的手势不能告诉它之前反弹。我尝试删除所有核心手势,添加我的,然后添加核心手势。但是在 UIScrollView 决定它正在弹跳之后,我的手势仍然被调用。

所以我有点茫然。还有其他人试图做这样的事情吗?

4

3 回答 3

8

您只需将此属性设置为 NO。(例如在 ViewDidLoad 中)

scrollView.bouncesZoom = 否;

于 2013-07-29T23:48:51.477 回答
4

我想写下这个问题有助于我走上寻找解决方案的道路。幸运的是,这很容易!因此,第一步,在我拥有的代码中minimumZoomScale,我还将cachedMinZoomScaleivar 设置为相同的值。这样一来,当比例小于最小值的 90% 时不发生反弹实际上是非常简单的:

- (void)scrollViewDidZoom:(UIScrollView *)scrollView {
    if (self.zoomScale / cachedMinZoomScale < 0.90) {
        self.minimumZoomScale = self.zoomScale;
    } else {
        self.minimumZoomScale = cachedMinZoomScale;
    }
}

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {
    if (self.zoomScale / cachedMinZoomScale < 0.90) {
        [self shrinkImageToNothing];
    }
}

基本上,当滚动视图缩放时,-self.minimumZoomScale如果它小于实际最小值的 90%,则保持当前缩放比例,但在任何其他缩放比例下将其设置为实际最小值。然后,当缩放完成时,如果我们低于 90% 的阈值,它不会恢复到任何东西,因为它已经是最小尺寸,然后只需调用新动画来缩小以关闭。

简单的。呸!

于 2011-03-07T06:34:59.703 回答
-2

试试这个,[imageScrollview setBounces:NO];

于 2012-07-25T05:31:36.450 回答