如何取消UIScrollView缩放弹跳?

the*_*ory 5 cocoa-touch zoom objective-c uiscrollview 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这很有效,除了此时它已经弹跳,所以设置minimumZoomScale什么都不做.因此,弹跳和收缩同时发生,你可能想象的看起来很奇怪.

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

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

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

小智 7

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

scrollView.bouncesZoom = NO;


the*_*ory 4

我想写下这个问题帮助我走上了寻找解决方案的道路。幸运的是,这很容易!因此,第一步,在我设置的代码中minimumZoomScale,我还将 ivar 设置cachedMinZoomScale为相同的值。这样,当比例小于最小值的 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];
    }
}
Run Code Online (Sandbox Code Playgroud)

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

简单的。唷!

  • ShrinkImageToNothing 正在做什么以及在哪里设置了 cachedMinZoomScale? (4认同)