【问题标题】:Turn off Zooming in UIScrollView关闭 UIScrollView 中的缩放
【发布时间】:2010-12-06 09:36:05
【问题描述】:

有谁知道在使用 UIScrollView 时暂时关闭缩放的方法?

我发现您可以使用以下方法禁用滚动:

self.scrollView.scrollEnabled = false;

但我没有看到类似的缩放命令。有什么想法吗?

【问题讨论】:

    标签: ios iphone uiscrollview zooming


    【解决方案1】:

    如果您想禁用用户缩放手势的功能,那么在 iOS 5 及更高版本中,您可以禁用捏合手势。这仍然允许您从代码中控制滚动视图...

    scrollView.pinchGestureRecognizer.enabled = NO;
    

    对于泛...

    scrollView.panGestureRecognizer.enabled = NO;
    

    这必须在- (void)viewDidAppear:(BOOL)animated 或更高版本中调用,否则系统会将其重置为启用。

    Swift 4.x 及更高版本:

    imageZoomView.pinchGestureRecognizer?.isEnabled = false / true

    【讨论】:

    • 这是最好的答案,应该接受手提袋!这似乎不会影响任何缩放代表或您当前的任何最小/最大 zoomScale 设置,正如有人指出的那样,这可能不一定反映用户是否缩放它。
    • 除了是最干净的替代品之外,它也是最简单的!鉴于人们在将近六年后仍在学习它(并且它在 iOS 8 中运行良好),我同意它应该获得绿色复选标记。
    • @oarfish 哪一部分不起作用?致电scrollView.pinchGestureRecognizer.enabled = NO; 后,缩放仍然有效?
    • 如果设置了缩放比例,最好再次启用手势。
    • 如果您是 UIScrollView 的子类,self.pinchGestureRecognizer.enabled = false(和另一个)可以在 -(void)didMoveToWindow 中调用。
    【解决方案2】:

    按照上面 fbrereto 的建议,我创建了两个函数 lockZoom 和 unlockZoom。锁定缩放时,我将最大和最小缩放比例复制到变量,然后将最大和最小缩放比例设置为 1.0。解锁缩放只会逆转这个过程。

    -(void)lockZoom
    {
        maximumZoomScale = self.scrollView.maximumZoomScale;
        minimumZoomScale = self.scrollView.minimumZoomScale;
    
        self.scrollView.maximumZoomScale = 1.0;
        self.scrollView.minimumZoomScale = 1.0;
    }
    
    -(void)unlockZoom
    {
    
        self.scrollView.maximumZoomScale = maximumZoomScale;
        self.scrollView.minimumZoomScale = minimumZoomScale;
    
    }
    

    【讨论】:

      【解决方案3】:

      您还可以在 UIScrollViewDelegate 中将“nil”作为缩放视图返回:

      - (UIView *) viewForZoomingInScrollView:(UIScrollView *) scrollView
      {
          return canZoom?view:nil;
      }
      

      【讨论】:

      • 我真的很喜欢这种方法,但要小心。像“scrollViewDidEndZooming”这样的委托方法仍然会被烦人地调用。
      • 我也见过这个。在我将scrollEnabled 设置为NO 后,UIKit 会自动将我的滚动视图缩小到zoomScale 1.0
      • 这个解决方案的问题是当你访问scrollView.zoomScale时,这个方法被调用,它返回nil,结果返回1.0作为你滚动视图的zoomScale
      • 我发现这个问题有一个问题。当键盘出现文本字段时,它不会滚动屏幕。 (文本字段位于将我的页面加载到服务器上的 Web 视图中)
      【解决方案4】:

      检查设置minimumZoomScalemaximumZoomScale;根据the docs

      maximumZoomScale 必须大于 minimumZoomScale 才能启用缩放。

      因此,将值设置为相同应该禁用缩放。

      【讨论】:

      • 我在情节提要中将 max 和 min 都设置为 1,但我的 scrollView 仍在缩放。
      【解决方案5】:

      我尝试将UIScrollViewminimumZoomScalemaximumZoomScale 属性设置为1isMultipleTouchEnabled 属性UIViewfalse 或从viewForZooming(in:)false 返回nil没有工作。在我的情况下,经过多次试验和错误,以下在我的情况下有效 [在 iOS 10.3 上测试]:

      class MyViewController: UIViewController {
         var webView: WKWebView?
      
         override viewDidLoad() {
            super.viewDidLoad()
      
            //...
            self.webView.scrollView.delegate = self
            //...
         }
      }
      
      extension MyViewController: UIScrollViewDelegate { 
         func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?) {
            scrollView.pinchGestureRecognizer?.isEnabled = false
         }
      }
      

      【讨论】:

      • 我认为这是 WKWebView 的滚动视图特有的。这几天我一直在搞砸。我发现您的解决方案的唯一缺点是有时网页在旋转时无法正确缩放。无论有没有您的解决方案都会发生这种情况,但是由于用户无法缩小以固定比例,因此我们必须水平滚动。很好找到这个!
      • 在 WKWebView 中禁用放大手势:stackoverflow.com/questions/25553711/…
      【解决方案6】:

      我知道这是一个很老的问题,但为了我的目的,我做了些许改动。

      我希望能够轻松判断缩放实际上是否启用/禁用,而不依赖于 scrollView.minimumZoomScale == scrollView.maximumZoomScale 之间的比较,这可能无法反映缩放是否实际启用/禁用。

      所以我这样做了

      // .h
      @property (assign, nonatomic, getter=isZoomEnabled) BOOL zoomEnabled;
      
      // .m
      @synthesize zoomEnabled = _zoomEnabled;
      
      - (void)setZoomEnabled:(BOOL)zoomEnabled;
      {
        _zoomEnabled = zoomEnabled;
      
        UIScrollView *scrollView = self.scrollView;
      
        if (zoomEnabled) {
          scrollView.minimumZoomScale = self.minimumZoomScale;
          scrollView.maximumZoomScale = self.maximumZoomScale;
        } else {
          scrollView.minimumZoomScale = 0.0f;
          scrollView.maximumZoomScale = 0.0f;
        }
      }
      

      self.minimumZoomScaleself.maximumZoomScale 的值是在配置 UIScrollView 时设置的。

      这使我能够设置/询问是否启用缩放。

      myViewController.zoomEnabled = YES;
      myViewController.isZoomEnabled;
      

      【讨论】:

        【解决方案7】:

        这里是我停止缩放滚动视图的解决方案。

        self.scrollView.minimumZoomScale=self.scrollView.maximumZoomScale;
        

        【讨论】:

        • 对我来说,这个消除缩放的解决方案的好处是我仍然可以使用 pinchGestureRecognizer。
        【解决方案8】:

        Swift 3 版本:

        func lockScrollViewZooming() {
            scrollView.minimumZoomScale = 1.0
            scrollView.maximumZoomScale = 1.0
            scrollView.bounces = false
            scrollView.bouncesZoom = false
        
            // Also, if you have double tap recognizer,
            // remember to remove it
            scrollView.removeGestureRecognizer(doubleTapGestureRecognizer)
        }
        
        func unlockScrollViewZooming() {
            scrollView.minimumZoomScale = 1.0
            scrollView.maximumZoomScale = 4.0
            scrollView.bounces = true
            scrollView.bouncesZoom = true
        
            // Also, if you have double tap recognizer,
            // remember to add it
            scrollView.removeGestureRecognizer(doubleTapGestureRecognizer)
        }
        

        注意doubleTapGestureRecognizer 应该是一个实例变量。它应该类似于:

        private lazy var doubleTapGestureRecognizer: UITapGestureRecognizer = {
            let doubleTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleDoubleTap(_:)))
            doubleTapGestureRecognizer.numberOfTapsRequired = 2
            doubleTapGestureRecognizer.delegate = self
        
            return doubleTapGestureRecognizer
        }()
        
        @objc private func handleDoubleTap(_ recognizer: UITapGestureRecognizer) {
            //scrollView.setZoomScale((scrollView.zoomScale > scrollView.minimumZoomScale) ? scrollView.minimumZoomScale : scrollView.maximumZoomScale, animated: true)
        
            if scrollView.zoomScale > scrollView.minimumZoomScale {
                scrollView.setZoomScale(scrollView.minimumZoomScale, animated: true)
            } else {
                let touchLocation = recognizer.location(in: recognizer.view)
                scrollView.zoom(to: CGRect(origin: touchLocation, size: CGSize(width: 22.0, height: 20.0)), animated: true)
            }
        }
        

        【讨论】:

        • lockScrollViewZomming() 方法有错误。应该是最大缩放比例,而不是最小两次。
        • 谢谢@malaba,请随时编辑答案:)
        • 不能!我的修改只有 2 个字符,而编辑器 required 至少 6...
        【解决方案9】:

        如果您只想通过捏合手势禁用缩放,下面的代码可以解决问题。

        scrollView.pinchGestureRecognizer?.requireGestureRecognizerToFail(scrollView.panGestureRecognizer)
        

        【讨论】:

          【解决方案10】:

          您需要关闭滚动视图的两指和双击

          self.scrollView.delegate = self
          

          extension YourViewController: UIScrollViewDelegate {
             func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?) {
                 scrollView.pinchGestureRecognizer?.isEnabled = false
             }
          
             func viewForZooming(in scrollView: UIScrollView) -> UIView? {
                 return nil
             }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-01-20
            • 1970-01-01
            • 2012-11-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-06-26
            相关资源
            最近更新 更多