【问题标题】:UIScrollView detect pinch zoom endUIScrollView 检测捏缩放结束
【发布时间】:2011-06-16 02:50:39
【问题描述】:

我正试图在UIScrollView 被捏缩缩小到超出其最小缩放限制并且即将动画回来时收到通知,但我发现这非常困难。有没有办法单独使用 delegate 方法来做到这一点,还是我需要覆盖 UIScrollView's 触摸处理?

【问题讨论】:

    标签: ios uiscrollview uiscrollviewdelegate


    【解决方案1】:

    使用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 以外的 zoomScale,比如 if !scrollView.zooming && scrollView.zoomScale < 0.6 {do something}
      【解决方案3】:

      在 Swift 4.0 中:

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

      这将在用户完成缩放并且 zoomScale 处于其最小可能值时调用,即当滚动视图完全缩小时。

      【讨论】:

      • 如果用户没有完全缩小,我如何检测到用户捏合缩小?
      • @Daniel Springer zoomScale 属性包含您需要的所有信息。当它们缩小时它会减小,因此请检查 zoomScale 是否减小而没有完全缩小(即一直到 minimumZoomScale)。如果您仍有问题,请在此处提出问题并将其链接,我可以分享一个示例
      • 为了检查它是否减少,我需要将之前的值保存到我自己的变量中吗?
      • 是的。 scrollView 中没有内置任何东西可以为您执行此操作,因此您需要使用自己的变量来跟踪它。
      • 知道了。谢谢!
      【解决方案4】:

      我用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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-24
        • 1970-01-01
        • 2012-01-29
        • 2015-04-25
        • 2017-09-23
        • 2014-02-16
        • 2012-06-17
        • 2023-03-28
        相关资源
        最近更新 更多