如何取消UIScrollView缩放弹跳?

时间:2011-03-07 06:13:19

标签: objective-c cocoa-touch uiscrollview zoom bounce

我正在使用缩放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决定退回之间执行某些操作。我尝试了一些没有运气的其他技术,包括:

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

所以我有点失落。其他人试图做这样的事情吗?

3 个答案:

答案 0 :(得分:7)

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

scrollView.bouncesZoom = NO;

答案 1 :(得分:4)

我想写出这个问题帮助我找到解决方案的道路。幸运的是,这很容易!所以,第一步,在我设置minimumZoomScale的代码中,我还将cachedMinZoomScale ivar设置为相同的值。有了这个,当规模小于最小值的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%的阈值,它将不会回溯到任何东西,因为它已经是最小尺寸,然后只需调用新动画缩小到关闭。

简单。呼!

答案 2 :(得分:-2)

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