Подтвердить что ты не робот

Выключить Масштабирование в UIScrollView

Кто-нибудь знает, как временно отключить масштабирование при использовании UIScrollView?

Я вижу, что вы можете отключить прокрутку, используя следующее:

self.scrollView.scrollEnabled = false;

но я не вижу подобную команду для масштабирования. Любые мысли?

4b9b3361

Ответ 1

Если вы хотите отключить возможность пользователя масштабировать жесты, то в iOS 5 и выше вы можете отключить жест повышения. Это по-прежнему позволяет вам контролировать вид прокрутки из кода...

scrollView.pinchGestureRecognizer.enabled = NO;

аналогично для кастрюли...

scrollView.panGestureRecognizer.enabled = NO;

Это должно вызываться в - (void)viewDidAppear:(BOOL)animated или более поздний, так как в противном случае система сбрасывает его во включенное состояние.

Swift 4.x и выше:

imageZoomView.pinchGestureRecognizer?.isEnabled= false/true

Ответ 2

Следуя совету fbrereto выше, я создал две функции lockZoom и unlockZoom. При блокировке Zoom я скопировал масштаб max и min zoom в переменные, затем установите масштаб масштабирования max и min в 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

Также вы можете вернуть "nil" в виде масштабирования в UIScrollViewDelegate:

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

Ответ 4

Проверить настройку minimumZoomScale и maximumZoomScale; Согласно документы:

maximumZoomScale должно быть больше, чем minimumZoomScale для масштабирования для включения.

Таким образом, установка значений одинакова должна отключать масштабирование.

Ответ 5

Я знаю, что это действительно старый вопрос, но я сделал небольшое изменение для своих целей.

Я хотел бы иметь возможность легко определить, действительно ли масштабирование было включено/отключено, не полагаясь на сравнение между 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;

Ответ 6

здесь, мое решение для остановки масштабирования на scrollview.

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

Ответ 7

версия 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)
    }
}

Ответ 8

Я попытался установить свойства minimumZoomScale и maximumZoomScale свойств UIScrollView в 1 или isMultipleTouchEnabled с UIView до false или вернуть nil из viewForZooming(in:) из UIScrollViewDelegate, но никто не работал. В моем случае после нескольких проб и ошибок в моем случае работает следующее [Протестировано на 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
   }
}

Ответ 9

Если вы хотите отключить только масштабирование с жестким типом, ниже код делает трюк.

scrollView.pinchGestureRecognizer?.requireGestureRecognizerToFail(scrollView.panGestureRecognizer)