簡體   English   中英

在 UIScrollView 中關閉縮放

[英]Turn off Zooming in UIScrollView

有誰知道在使用 UIScrollView 時暫時關閉縮放的方法?

我看到您可以使用以下方法禁用滾動:

self.scrollView.scrollEnabled = false;

但我沒有看到類似的縮放命令。 有什么想法嗎?

如果您想禁用用戶縮放手勢的能力,那么在 iOS 5 及更高版本中,您可以禁用捏合手勢。 這仍然允許您從代碼控制滾動視圖...

scrollView.pinchGestureRecognizer.enabled = NO;

同樣對於鍋...

scrollView.panGestureRecognizer.enabled = NO;

這必須在- (void)viewDidAppear:(BOOL)animated或以后調用,否則系統會將其重置為啟用。

Swift 4.x 及更高版本:

imageZoomView.pinchGestureRecognizer?.isEnabled = false / true

按照上面 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;

}

您也可以在 UIScrollViewDelegate 中返回“nil”作為縮放視圖:

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

檢查設置minimumZoomScalemaximumZoomScale 根據文檔

maximumZoomScale必須大於minimumZoomScale才能啟用縮放。

因此,將值設置為相同應該禁用縮放。

我曾嘗試將UIScrollView minimumZoomScalemaximumZoomScale屬性設置為1或將UIView isMultipleTouchEnabled屬性設置為false或從UIScrollViewDelegate viewForZooming(in:)返回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
   }
}

在這里,我停止縮放滾動視圖的解決方案。

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

我知道這是一個非常古老的問題,但為了我的目的,我做了一些改動。

我希望能夠輕松判斷縮放是否實際上已啟用/禁用,而不依賴於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;

斯威夫特 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)
    }
}

如果您只想禁用捏合手勢縮放,下面的代碼可以解決問題。

scrollView.pinchGestureRecognizer?.requireGestureRecognizerToFail(scrollView.panGestureRecognizer)

您需要關閉滾動視圖的兩指和雙擊

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
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM