web-dev-qa-db-ja.com

UIScrollViewのズームをオフにします

UIScrollViewを使用するときにズームを一時的にオフにする方法を知っている人はいますか?

以下を使用してスクロールを無効にできることがわかりました。

self.scrollView.scrollEnabled = false;

しかし、ズームのための同様のコマンドは表示されません。何かご意見は?

31

ユーザーがジェスチャをズームする機能を無効にする場合は、iOS5以降でピンチジェスチャを無効にできます。これにより、コードからスクロールビューを制御できます...

_scrollView.pinchGestureRecognizer.enabled = NO;
_

パンについても同様です。

_scrollView.panGestureRecognizer.enabled = NO;
_

これは- (void)viewDidAppear:(BOOL)animated以降で呼び出す必要があります。そうしないと、システムがリセットして有効にします。

Swift 4.x以降:

_imageZoomView.pinchGestureRecognizer?.isEnabled_ = false/true

43
combinatorial

上記のfbreretoのアドバイスに従って、lockZoomとunlockZoomの2つの関数を作成しました。ズームをロックするときに、最大と最小のズームスケールを変数にコピーしてから、最大と最小のズームスケールを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;

}
29

また、UIScrollViewDelegateのズームビューとして「nil」を返すこともできます。

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

設定minimumZoomScaleおよびmaximumZoomScaleを確認してください。 ドキュメント によると:

ズームを有効にするには、maximumZoomScaleminimumZoomScaleより大きくなければなりません。

したがって、値を同じに設定すると、ズームが無効になります。

10
fbrereto

ここでは、scrollviewのズームを停止するための私の解決策です。

self.scrollView.minimumZoomScale=self.scrollView.maximumZoomScale;
2
iChirag

これは本当に古い質問だと思いますが、目的に合わせて少し変更を加えました。

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.minimumZoomScaleおよびself.maximumZoomScaleの値は、UIScrollViewの構成時に設定されます。

これにより、ズームが有効になっているかどうかを設定/確認することができます。

myViewController.zoomEnabled = YES;
myViewController.isZoomEnabled;
2
Paul.s

Swift 3バージョン:

func lockScrollViewZooming() {
    scrollView.minimumZoomScale = 1.0
    scrollView.minimumZoomScale = 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)
    }
}
1
Ahmad F

minimumZoomScalemaximumZoomScaleおよびUIScrollViewプロパティを_1_に設定するか、isMultipleTouchEnabledUIViewプロパティをfalseまたはnilviewForZooming(in:)からUIScrollViewDelegateを返しますが、何も機能しませんでした。私の場合、何度か試行錯誤した後、私の場合は次のように機能します[iOS10.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
   }
}
_
1
yohannes

ピンチジェスチャによるズームのみを無効にしたい場合は、以下のコードでうまくいきます。

scrollView.pinchGestureRecognizer?.requireGestureRecognizerToFail(scrollView.panGestureRecognizer)
0
mmtootmm