UIScrollView检测缩放结束

7

我想在UIScrollView被缩放到最小缩放限制并即将动画返回时得到通知,但我发现这很困难。有没有办法只使用delegate方法来实现这个功能,或者我需要重写UIScrollView的触摸处理?

4个回答

11

使用 scrollViewDidZoom:,并检查 scrollView.zoomBouncing == YES。然后使用 zoomScale 确定视图反弹的方向。

- (void)scrollViewDidZoom:(UIScrollView *)scrollView {
    if (scrollView.zoomBouncing) {
        if (scrollView.zoomScale == scrollView.maximumZoomScale) {
            NSLog(@"Bouncing back from maximum zoom");
        }
        else
        if (scrollView.zoomScale == scrollView.minimumZoomScale) {
            NSLog(@"Bouncing back from minimum zoom");
        }
    }
}

2
您可以使用UIScrollView的scrollViewDidZoom委托方法来检测它即将开始动画的时刻。在视图被捏合时,您会看到scrollView.zoomScale下降到scrollView.minimumZoomScale以下。然后,一旦用户释放手指,scrollViewDidZoom将再次被调用,此时scrollView.zoomScale == scrollView.minimumZoomScale,但scrollView.zooming == NO。
捕捉这一时刻是好的,但是尝试对反弹到minimumZoomScale的动画进行任何预先操作似乎对我产生了非常奇怪的副作用。:(

如果我想捕获除minimumZoomScale之外的zoomScale,该怎么办?例如:if !scrollView.zooming && scrollView.zoomScale < 0.6 {do something} - osrl

2

在Swift 4.0中:

func scrollViewDidZoom(_ scrollView: UIScrollView) {
    if scrollView.zoomScale == scrollView.minimumZoomScale
    {
        print("zoomed out")
    }
}

当用户完成缩放且缩放比例达到最小值时,即滚动视图完全缩小时,将会准确地调用此函数。


如果用户没有完全缩小,我如何检测到他们捏合以缩小屏幕? - user5306470
@Daniel Springer,zoomScale属性包含了您所需的所有信息。当他们缩小时,它将会减少,因此请检查zoomScale是否已经减少而没有全部缩小(即全部到达minimumZoomScale)。如果您仍然有问题,请提出问题并在此处链接,我可以分享一个示例。 - KhanKhuu
为了检查它是否减少,我需要将先前的值保存到自己的变量中吗? - user5306470
没错。scrollView 中没有内置的功能可以为您完成此操作,因此您需要使用自己的变量来跟踪它。 - KhanKhuu
明白了。谢谢! - user5306470

0
我使用了 UIPinchGestureRecognizer 来完成它。
-(void)viewDidLoad{
    UIPinchGestureRecognizer *gestureRecognizer = 
     [[[UIPinchGestureRecognizer alloc] initWithTarget:self 
                                                action:@selector(pinched:)] 
                                                               autorelease];
    gestureRecognizer.delegate=self;
    [self.scrollView addGestureRecognizer:gestureRecognizer];
    //your code
}
-(void)pinched:(UIPinchGestureRecognizer*)gestureRecognizer{
    if(gestureRecognizer.state==UIGestureRecognizerStateEnded){
        //pinch ended
        NSLog(@"scale: %f",scrollView.zoomScale);
    }
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
        shouldRecognizeSimultaneouslyWithGestureRecognizer:
                          (UIGestureRecognizer *)otherGestureRecognizer{
    return YES;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接